【发布时间】:2023-03-17 08:52:01
【问题描述】:
我知道模板可以绑定到承诺或真实值,并且当该值更改时,模板会更新。
我想在指令中做一些类似的事情,我观察一个承诺的变化,并在该承诺更新时重新加载指令中的数据。
但是,当我看到一个承诺时,它似乎注册了更改,但随后立即设置为“未定义”。
见http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=preview
您可以看到模板更新没有问题,但是如果您检查控制台,“isNotAPromise”手表按预期工作,但“isAPromise”手表被触发两次,都是“未定义”。
有什么线索吗?
下面是让你开心的代码:
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]);
});
});
谢谢, 罗伊
【问题讨论】:
-
这与AngularJS的生命周期有关。还有其他关于这个的答案。 $watch 在开始时至少被调用两次,因此您可能需要检查 undefined 和 newval == oldval。
-
感谢 jpmorin,但这个问题更多的是关于承诺和非承诺之间的区别 - 这些场景返回到手表的值是不同的