我有一个非常具体的问题,指令以某些字母开头(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完成时。)
这种行为来自哪里?
答案 0 :(得分:1)
这里有三种机制来解释这种行为:
观察者以相同的顺序执行,他们已注册(see the code of the $watch
method())。
后链接功能以优先级<{3}}的反向顺序执行。
具有相同优先级的指令以未定义的顺序执行。默认优先级为0
,因此此处的所有自定义指令都具有此优先级。由于see the documentation for the priority
property指令也是0
的优先级,因此执行顺序未定义。
正如您所注意到的那样,&#34;未定义&#34;有点过分,实际执行的顺序是字母顺序(select
):在字典开头有一个名字的指令有更高的优先级。但是,根据我的拙见,由于文档中没有明确说明,您不能依赖此行为。
总结一下,这是一些用例。每个指令都注册一个观察者。
Name | Priority | Watcher order
--------+------------+--------------
A | 100 | 3rd
B | 0 | 2nd
C | none (= 0) | 1st
因此,解决问题很简单:
select
之后执行自定义指令的观察程序,只需将指令的优先级高于0
。select
之前执行自定义指令的观察者,那么......因为禁止使用否定优先级,所以您无法可靠地执行此操作。