angular度ng-bind-html和它内的指令
Plunker链接
我有一个元素,我想绑定到它的HTML。
<div ng-bind-html="details" upper></div>
这样可行。 现在,随着它,我也有一个绑定到绑定的HTML的指令:
$scope.details = 'Success! <a href="#/details/12" upper>details</a>'
但是div和anchor的指令不会评估。 我如何使它工作?
我也遇到了这个问题,经过几个小时的search,我读了@Candermani的评论,这被certificate是解决scheme。 你需要用这个模式调用一个'compile'指令:
HTML:
<div compile="details"></div>
JS:
.directive('compile', ['$compile', function ($compile) { return function(scope, element, attrs) { scope.$watch( function(scope) { // watch the 'compile' expression for changes return scope.$eval(attrs.compile); }, function(value) { // when the 'compile' expression changes // assign it into the current DOM element.html(value); // compile the new DOM and link it to the current // scope. // NOTE: we only compile .childNodes so that // we don't get into infinite loop compiling ourselves $compile(element.contents())(scope); } ); }; }])
你可以在这里看到一个工作小提琴
感谢伟大的回答vkammerer。 我build议的一个优化是在编译运行一次之后就不要看着。 监视expression式中的$ eval可能会影响性能。
angular.module('vkApp') .directive('compile', ['$compile', function ($compile) { return function(scope, element, attrs) { var ensureCompileRunsOnce = scope.$watch( function(scope) { // watch the 'compile' expression for changes return scope.$eval(attrs.compile); }, function(value) { // when the 'compile' expression changes // assign it into the current DOM element.html(value); // compile the new DOM and link it to the current // scope. // NOTE: we only compile .childNodes so that // we don't get into infinite loop compiling ourselves $compile(element.contents())(scope); // Use un-watch feature to ensure compilation happens only once. ensureCompileRunsOnce(); } ); }; }]);
这是一个分叉和更新的小提琴。
添加这个指令angular-bind-html-compile
.directive('bindHtmlCompile', ['$compile', function ($compile) { return { restrict: 'A', link: function (scope, element, attrs) { scope.$watch(function () { return scope.$eval(attrs.bindHtmlCompile); }, function (value) { // Incase value is a TrustedValueHolderType, sometimes it // needs to be explicitly called into a string in order to // get the HTML string. element.html(value && value.toString()); // If scope is provided use it, otherwise use parent scope var compileScope = scope; if (attrs.bindHtmlScope) { compileScope = scope.$eval(attrs.bindHtmlScope); } $compile(element.contents())(compileScope); }); } }; }]);
像这样使用它:
<div bind-html-compile="data.content"></div>
真的很容易:)
不幸的是,我没有足够的评价。
我无法让这个工作多年。 我修改了我的ng-bind-html
代码来使用这个自定义指令,但是我没有移除ng-bind-html工作所需的$scope.html = $sce.trustAsHtml($scope.html)
。 只要我删除这个,编译function开始工作。
对于任何处理已经通过$sce.trustAsHtml
运行的内容的人来说,这是我不得不做的
function(scope, element, attrs) { var ensureCompileRunsOnce = scope.$watch(function(scope) { return $sce.parseAsHtml(attrs.compile)(scope); }, function(value) { // when the parsed expression changes assign it into the current DOM element.html(value); // compile the new DOM and link it to the current scope. $compile(element.contents())(scope); // Use un-watch feature to ensure compilation happens only once. ensureCompileRunsOnce(); }); }
这只是指令的link
部分,因为我使用的是不同的布局。 您将需要注入$sce
服务以及$compile
。
最好的解决scheme,我find了! 我复制它,它的工作正如我所需要的。 谢谢,谢谢,谢谢…
在指令链接function我有
app.directive('element',function($compile){ . . var addXml = function(){ var el = $compile('<xml-definitions definitions="definitions" />')($scope); $scope.renderingElement = el.html(); } . .
并在指令模板中:
<span compile="renderingElement"></span>