观察Angular 1.2.0+中的承诺(资源)变化

时间:2013-12-08 03:08:19

标签: angularjs promise

我正在使用$ 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 +。

2 个答案:

答案 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);