【发布时间】:2017-11-14 01:25:26
【问题描述】:
我正在使用基于我的 JSON 的模板。所以,我不能像往常那样使用我的 ng-bind-html。
似乎我唯一的选择是在指令中使用经过清理的 html。 寻找类似的问题,我无法弄清楚如何在我的情况下申请。 是的,我是 Angular 的新手。
我目前正在从我的控制器接收此数据:
$scope.safecontainers = $sanitize($scope.containersmsg);
在我的html中通常是这样的:
<p ng-bind-html="containersmsg"></p>
但我不想要这个,我需要在指令中使用这个 ng-bind-html!
有些人谈到了 $compile,但我真的不知道如何在我的情况下应用。
编辑:
基于cmets,我将添加更多代码,以帮助大家进一步了解我的目标。
在我的 index.html 中,我声明了所需的控制器并调用了我的
<ng-view></ng-view>
然后,根据我收到的内容,我将加载一个或另一个视图:
<div ng-if='setores[0].SetorTema == "1"'>
<theme-one titulo="{{setores[0].SetorNome}}" logo="
{{setores[0].SetorLogo}}" evento="{{evento[0].EventoNome}}">
</theme-one>
// I omitted some of the parameters because they ain't relevant
</div>
我的模板是这样的:(只做一小部分,避免出现很多无用的代码)
<section class="target">
<div class="col-md-6 col-xs-12">
<div class="" ng-repeat="banner in title">
<div class="target-title">{{ banner.BannerLevelTitulo }}
</div>
<div class="target-desc">{{banner.BannerLevelDescricao}}</div>
</div>
</div>
<div class="col-md-6 col-xs-hidden">
<div class="target-image"><img ng-src="{{targetimage}}" alt="">
</div>
</div>
</section>
这是我想要我的净化代码的控制器。
hotsite.controller('containerController', function($scope, $http, $sanitize)
{
$scope.containers = [];
$scope.containersmsg = '';
$scope.safecontainers = $sanitize($scope.containersmsg);
$http.get('/Admin/rest/getContainer')
.then(function onSuccess(response) {
var data = response.data;
$scope.containers = data;
$scope.containers = response.data.filter(containers =>
containers.ContainerAtivo);
$scope.containersmsg = $scope.containers[0].ContainerDesc;
})
.catch(function onError(response) {
var data = response.data;
console.log(data);
});
});
这是我的指令的一部分:
angular.module('hotsiteDirectives', [])
.directive('themeOne', function($compile) {
var ddo = {};
ddo.restrict = "AE";
ddo.transclude = true;
ddo.scope = {
titulo: '@',
...
(a lot of other scope's)
contimg: '@'
};
ddo.templateUrl = 'app/directives/theme-one.html';
return ddo;
})
是的,我正在调用 ngSanitize
var hotsite = angular.module('hotsite',['ngRoute', 'hotsiteDirectives',
'ngSanitize']);
TL;DR
这是我的代码在指令中的样子,带有原始 html 且未呈现:
这就是它与 ng-bind-html 的工作方式,格式化的 html
如果我确实把它放在我的视图中
<p ng-bind-html="containersmsg"></p>
没关系,一切正常。
但是,我只需要在我的指令中调用它,我不知道该怎么做。 因此,在这种情况下:
如何将经过净化的 html 放入指令和模板中?
【问题讨论】:
-
你试过
$sce.trustAsHtml(...)吗?以及其他trustAs and parseAs 函数? -
目前还不清楚您的问题是什么。指令在哪里声明?您如何为您传递的各种属性创建
$scope属性?为什么将这种 HTML 存储在数据变量中而不是普通的模板文件中?将 HTML 存储在变量中的唯一原因是,如果您打算让用户修改内容,但用户通常不会修改(甚至知道)角度属性......这就像你正在尝试以不同于预期的方式使用 AngularJs.... -
@Claies 我将这些变量传递给其他控制器,我只是省略了代码,因为它对问题没有任何价值。是的,我的用户将修改内容。问题是:如何在指令中使用经过清理的数据?
-
这需要一些工作,因为这不是 angular 的设计方式。为您的用户提供可能存在于
$scope中的属性的名称,要求他们使用角度语法,并希望他们不要进行可能以意想不到的方式修改数据的拼写错误或页面编辑,未选中,似乎一个非常糟糕的想法。 -
$sce的全部意义在于保护您免受可能输入 HTML sn-ps 的恶意代码的侵害。通过让您的用户直接使用角度语法修改 HTML,您实际上是在尝试完全允许 $sce阻止的事情。
标签: html angularjs angularjs-directive