在Angular js中调用$ sce.trustAsHtml()字符串中的函数

Raj*_*iya 13 javascript angularjs

我正在使用Angularjs开发一个应用程序并在我的页面中添加HTML使用$sce.trustAsHtml().我想在上面动态添加内容中调用一个函数.我的html和脚本如下.

HTML

<div ng-app="ngBindHtmlExample">
  <div ng-controller="ngBindHtmlCtrl">
   <p ng-bind-html="myHTML"></p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

使用Javascript

angular.module('ngBindHtmlExample', ['ngSanitize'])

.controller('ngBindHtmlCtrl', ['$scope','$sce', function ngBindHtmlCtrl($scope, $sce) {
  $scope.myHTML =$sce.trustAsHtml(
     'I am an <code>HTML</code>string with <a href="#" ng-mouseover="removeExp()">links!</a> and other <em>stuff</em>');

    $scope.removeExp = function (){
       console.log('dfdfgdfgdfg');
    }
}]);
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

点击这里查看

dta*_*enc 46

这有点棘手,因为它ng-bind-html只是简单地插入普通的旧html而不是编译它(所以html中的任何指令都不会被angular处理.

诀窍是找到一种在模板更改时进行编译的方法.例如,您可以创建一个执行此操作的指令.它看起来像:

.directive('compileTemplate', function($compile, $parse){
    return {
        link: function(scope, element, attr){
            var parsed = $parse(attr.ngBindHtml);
            function getStringValue() { return (parsed(scope) || '').toString(); }

            //Recompile if the template changes
            scope.$watch(getStringValue, function() {
                $compile(element, null, -9999)(scope);  //The -9999 makes it skip directives so that we do not recompile ourselves
            });
        }         
    }
});
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

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

请参阅此处的工作示例:

http://jsfiddle.net/3J25M/2/