以下问题:当创建一个正在监视属性的元素指令时,如果监视的表达式解析为承诺(使用 Kris Kowal 的 Q 库),则不会触发监视。JSFiddle:http: //jsfiddle.net/Netaork/PjS8J/
片段:
var module = angular.module("my-module", []);
angular.module('my-module').directive('promise', function ($compile) {
return {
link: function (scope, iElement, iAttrs) {
// watch variant 1, watching the expression directly
scope.$watch(iAttrs['use'], function(newValue, oldValue) {
console.log('1.)', newValue, oldValue);
});
// watch variant 2, using a function and $eval to evaluate the expression
scope.$watch(function(scope) {
return scope.$eval(iAttrs['use']);
}, function(newValue, oldValue) {
console.log('2.)', newValue, oldValue);
});
// watch variant 3, using a function and return watched expression, this
// works only for atomar expressions, but is the only one to trigger if
// the expression resolves to a promise
scope.$watch(function(scope) {
return scope[iAttrs['use']];
}, function(newValue, oldValue) {
console.log('3.)', newValue, oldValue);
});
},
restrict: 'E'
};
});
function MyCtrl($scope) {
var promise = Q.defer().promise;
//promise = { a: 'Hello World', b: 1337 };
$scope.pr = promise;
$scope.getPr = function() {
return promise;
}
}
HTML 看起来很简单:
<div ng-app="my-module">
<div ng-controller="MyCtrl">
<promise use="getPr()"></promise>
<promise use="pr"></promise>
</div>
</div>
第一个 Promise 元素仅触发带有 Promise 的 watch 1 和 2。Watch 3 显然无法解析,因为语法已经错误。所以这一切都符合预期。
第二个 Promise 元素显示仅触发 watch 3,这是出乎意料的。
如果您取消注释控制器中的行以与标准对象交换承诺,一切都会按预期触发。
我在这里想念什么吗?Angular 文档说它使用angular.equals来测试不断变化的对象。如果我针对 undefined 测试我的承诺,它会返回 true。