我知道模板可以绑定到promise或real值,当该值更改时,模板会更新。
我想在一个指令中执行类似的操作,在那里我会查看对promise的更改,并在更新该promise时重新加载指令中的数据。
但是,当我看到一个承诺时,它似乎注册了更改,但随后立即设置为'undefined'。
请参阅http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=preview
正如您所看到的,模板更新没有问题,但是如果您检查控制台,'isNotAPromise'监视按预期工作,但'isAPromise'监视会被触发两次,都是'undefined'。
任何线索?
以下是让SO满意的代码:
app.controller('MainCtrl', function($scope, $q) {
var c;
c = 1;
setInterval(function() {
c = c + 1;
console.log('---------------');
console.log(['c changed to ', c]);
return $scope.$apply(function() {
$scope.isNotAPromise = c;
return $scope.isAPromise = $q.when(c);
});
}, 1000);
$scope.$watch('isAPromise', function(newVal, oldVal) {
return console.log(['isAPromise changed', oldVal, newVal]);
});
return $scope.$watch('isNotAPromise', function(newVal, oldVal) {
return console.log(['isNotAPromise changed', oldVal, newVal]);
});
});
谢谢, 罗伊
答案 0 :(得分:2)
我添加了一个时间戳来确定两个手表何时触发:
console.log [+new Date(), 'isAPromise changed', oldVal, newVal]
示例输出:
["c changed to ", 3] app.js:12
[1366223960472, "isAPromise changed", 2, undefined] app.js:19
["isNotAPromise changed", 2, 3] app.js:22
[1366223960473, "isAPromise changed", undefined, 3]
因此,isAPromise
上的两只手表相隔1毫秒。我猜测会发生的事情是,$q.when(c)
首次分配给$scope.isAPromise
时,它是undefined
,因为承诺尚未解决。然后解决了承诺(可能在下一个$ digest循环期间),然后将isAPromise
设置为(已解决的?)承诺的值。