AngularJS:是否可以在没有 $watch 的情况下对 ng-bind-html 进行 post 处理?

AngularJS: Is it possible to do post-processing of ng-bind-html without $watch?

我有 html 内容 应该由 ng-bind-html 指令输出,并且在我想对这些内容进行一些操作之后(例如 DOM 操作、jQuery 插件等)。

Whosebug 为我提供 :

<div ng-app="myApp" ng-controller="myCtrl">
   <div ng-bind="sometext" my-directive>before</div>
</div>

因此创建具有更高优先级的自定义指令并在内部观察:

angular.module('myApp').directive('myDirective', function() { 
    return {
        priority: 10, 
        link: function(scope,element,attrs) {
            scope.$watch(attrs.ngBind, function(newvalue) {
              console.log("element ",element.text());
            });           
        }
    };      
 });

Demo

但就我不打算更改此内容而言,我不想使用 $watch。没有 $watch 可以吗?

选项 1(根据要求避免 $watch):

一个选择是跳过 ng-bind-html$compile$parse 你自己的 html。 Angular 的 ngBindHtml 本身做了一些类似的事情:

var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);
// ... It does some other, less relevant stuff between these
element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');

Angular's relevant source code can be viewed here

所以你总是可以编写一个自定义指令来完成这些事情,以及 post- 处理(如果需要,甚至是预处理)。大致如下:

var ngBindHtmlGetter = $parse(attrs.someAttrContainingContent);
element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');
doPostProcessing(element); // Your additional stuff goes here

选项2(保留$watch,但解除绑定):

如果您想使用 ng-bind-html 并且您只是担心周围有额外的观察者,另一种选择对您来说可能更简单,那就是取消绑定观察者。您可以很容易地解除绑定($watch returns 一个 "unbind" 函数):

var unbindPostProcess = scope.$watch(attrs.ngBind, function(newvalue) {
    doPostProcessing(element); // Whatever the additional function may be
    unbindPostProcess(); // Perhaps guarded to unbind at the right time.
});

我可能完全误解了你在找什么,但是,如果问题是;

How do I bind HTML to the view without a $watcher?

this jsBin 展示了方法。

通过升级到 angular-1.3.x 您可以访问一次性绑定 {{::expr}}.

因此,这实际上只是信任任何 sometext 可能是 HTML(通过使用 $sce)并使用 ng-bind-html="::sometext" 输出它的问题。

Et voila,没有 $watchers,您可以完全废弃自定义指令。


哦,还有 如果这不是你想要的,请告诉我,我会删除我的答案。