在AngularJS中,为什么终端自定义指令的行为会随内置指令而改变?

时间:2013-12-18 17:53:12

标签: javascript angularjs angularjs-directive angularjs-ng-repeat

根据我的理解,将terminal设置为true将导致该指令最后执行,并且具有更高优先级的任何指令将在它之前(自然地)执行,并且具有较低优先级的任何指令将不会在所有。

但是,当使用带有内置指令的自定义指令时,似乎会切换此行为。假设我们使用带有ng-repeat的自定义指令,除非自定义指令的优先级小于1000(这是ng-repeat的优先级),它将不会执行。

这是一个代表我的问题的JSFiddle:http://jsfiddle.net/codef0rmer/aNCY3/

参考JSFiddle代码,仅使用自定义指令(firstsecond):只要first的优先级为2或更高,它就会在second之前执行{1}}。如果优先级高于2,则不会执行。

将自定义指令与内置指令(noEntryngRepeat)结合使用:由于ngRepeat的优先级为1000,如果noEntry具有优先级如果为1000或更高,它将不会执行,但它将以低于1000的优先级执行。

1 个答案:

答案 0 :(得分:2)

我在你的小提琴的my fork做了一些窥探,我发现当自定义指令具有更高的优先级时,它会在ng-repeat之前执行。换句话说,它是在li实际呈现在DOM之前执行的。由于没有要追加的列表项,因此没有任何反应。

您可以看到该指令通过在指令中的console.log之前添加return语句并在浏览器上打开控制台来执行,就像我在这里所做的那样:

App.directive('noEntry', function() {
    console.log("Testing...");
    return {
        restrict: 'A',
        priority: 1001,
        link: function(scope, element, attrs) {
            element.append('No Entry: Executed ');
        }        
    };
});

使用terminal中的second声明,我认为no-entry没有任何效果。