我正在使用$ resource来加载我的控制器中的项目数组:
$scope.items = api.items.query();
$scope.items
现在是承诺。解决后,它包含项目数组。比我有一些方法,操纵项目,例如:
// template
<div ng-repeat="item in items">
<a href="" ng-click="doSomething(item)">Do it!</a>
</div>
// controller:
$scope.doSomething = function(item) {
item.$doSomething(); // the items
};
在这里,我想观察$scope.items
中的更改,以便在任何项目更改后收到通知。我试过这个:
$scope.$watch($scope.items, function() {
console.log('changed');
});
但这不起作用 - 在doSomething更改对象后不会触发它。两者都没有帮助第三个objectEquality
参数。我也试过$watchCollection
,但没有运气。
我发现这个工作时间很短 - 自Angular 1.2.rc2引入了承诺解包(https://github.com/angular/angular.js/issues/3503),但它在1.2.0(https://github.com/angular/angular.js/issues/4158)中删除了。
现在有没有(目前稳定的是Angular 1.2.4)如何做到这一点?
谢谢!
P.S。:这也在这个问题中讨论过:AngularJS - binding/watching a function which returns a promise,但这不适用于1.2.0 +。
答案 0 :(得分:0)
不要将Promise分配给$ scope.items,等待promise解析,然后将结果分配给$ scope.items。
api.items.query().then(function(itemsQueryResults){
$scope.items = itemsQueryResults;
});
更新items属性时,Angular将正常运行摘要循环,并且将填充ng-repeat。
答案 1 :(得分:0)
在Angular 1.4.6中,我能够通过向$ watch添加第三个参数来解决这个问题。请注意,我还必须通过字符串名称引用scope属性:
$scope.$watch('items', function() {
console.log('changed');
}, true);