使用$ sce在Angular 1.3.9视图中显示HTML

Jer*_*lle 9 angularjs

我正在尝试在Angular视图中显示HTML字符串.

起初,我天真地试过这个:

<p>{{ad.text}}</p>

$scope.ad = { 'text' : '<a href="#">Link</a>'}; // Dynamically fetched, etc. This is just an example text
Run Code Online (Sandbox Code Playgroud)

但这只是<a href="#">Link</a>在视图中显示,而不是:链接.

经过一番研究,我偶然发现了ngSanitize.我尝试过,但它完全剥离了所有HTML代码,只留下原始文本.确实非常安全.实际上有点太多了.无论如何,ngSanitize现在已经过时了.

此SO帖子表明现在必须使用$ sce服务而不是ngSnitize.

遵循这些不同的解决方案,这就是我想出的:

HTML

<p ng-bind-html="htmlAdText"></p>
Run Code Online (Sandbox Code Playgroud)

JS

$scope.ad = { 'text' : '<a href="#">Link</a>'};

$scope.htmlAdText = $sce.trustAsHtml($scope.ad.text);
Run Code Online (Sandbox Code Playgroud)

但是这个错误出现在控制台中:

ReferenceError: $sce is not defined
Run Code Online (Sandbox Code Playgroud)

让我烦恼的是$ sce服务应该是自v1.2以来Angular核心的一部分,而我正在使用v1.3.9.

这里发生了什么?有没有人有一个明确的方法来在AngularJS视图中显示HTML(没有只留下原始文本的过滤器)?

Sam*_*vic 30

不要忘记将其注入控制器,例如:

app.controller('mainCtrl', [ '$scope', '$sce', function($scope, $sce){
    $scope.ad = { 'text' : '<a href="#">Link</a>'};
    $scope.htmlAdText = $sce.trustAsHtml($scope.ad.text);
}]); //End Controller
Run Code Online (Sandbox Code Playgroud)

  • 是的,您必须手动将其注入控制器,当您考虑它时,它是有道理的.否则,您将不断地将所有服务注入您的控制器,即使是那些您不使用的服务.除了不必明确地将其写出来之外,这只会使控制器膨胀,并且在这种情况下显性而不膨胀优于隐式和膨胀. (2认同)