有效的指令名称

时间:2014-06-03 09:59:09

标签: angularjs angularjs-directive

我有一个非常具体的问题,指令以某些字母开头(t,u,v,w,y,z)。该指令用于select元素,并且正在关注ngOptions更改。

当使用来自Ajax请求的数据填充ngOptions时,指令名称以某个字母开头,例如w,第二个监视回调在创建选择选项之前触发。如果指令名称以不同的字母(a,k,m,n)开头,则在创建选项后将触发第二个监视回调。

Here is a sample有多个以各种字母开头的指令。打开控制台以查看问题。

<select w-foo ng-model="bar" ng-options="o.name for o in options"></select>
app.controller("test", function ($scope, $timeout) {

    // Emulate ajaxed options
    $timeout(function () {
        $scope.options = [{
            name: "aaa",
            id: 1
        }, {
            name: "bbb",
            id: 2
        }, {
            name: "ccc",
            id: 3
        }];
    }, 500);

});

app.directive("wFoo", function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            scope.$watch(attrs.ngOptions.replace(/.*in /, ""), function () {
                console.log("w-foo ngOptions changed", element.html());
            });
        }
    };
});

在上面的代码中,element.html()在第一个观看回调(初始摘要)中将包含一个空的option,并且在第二个摘要中也会包含一个空的option(当Ajax完成时。)

这种行为来自哪里?

1 个答案:

答案 0 :(得分:1)

这里有三种机制来解释这种行为:

  1. 观察者以相同的顺序执行,他们已注册(see the code of the $watch method())。

  2. 后链接功能以优先级<{3}}的反向顺序执行。

  3. 具有相同优先级的指令以未定义的顺序执行。默认优先级为0,因此此处的所有自定义指令都具有此优先级。由于see the documentation for the priority property指令也是0的优先级,因此执行顺序未定义。

    正如您所注意到的那样,&#34;未定义&#34;有点过分,实际执行的顺序是字母顺序select):在字典开头有一个名字的指令有更高的优先级。但是,根据我的拙见,由于文档中没有明确说明,您不能依赖此行为

  4. 总结一下,这是一些用例。每个指令都注册一个观察者。

      Name  |  Priority  | Watcher order
    --------+------------+--------------
    A       | 100        | 3rd
    B       | 0          | 2nd
    C       | none (= 0) | 1st
    

    因此,解决问题很简单:

    • 如果您希望在<{strong> select之后执行自定义指令的观察程序,只需将指令的优先级高于0
    • 如果您想在<{strong> select之前执行自定义指令的观察者,那么......因为禁止使用否定优先级,所以您无法可靠地执行此操作。