2013-12-08 119 views
1

改變我使用$資源,在我的控制器項目的裝陣:觀看承諾(資源)的角度1.2.0+

$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,但沒有運氣。

我發現這個工作了很短的時間 - 自從角1.2.rc2引入了承諾解包(https://github.com/angular/angular.js/issues/3503),但它在1.2.0(https://github.com/angular/angular.js/issues/4158)中被刪除。

所以現在有(目前穩定是角1.2.4)任何方式如何做到這一點?

謝謝!

P.S .:這個問題也在這個問題中討論過:AngularJS - binding/watching a function which returns a promise,但這不適用於1.2.0+。

+0

也許是因爲這樣? https://github.com/angular/angular.js/commit/5dc35b527b3c99f6544b8cb52e93c6510d3ac577 – jpsimons

+0

我知道它,但:「此功能已被棄用,如果絕對需要,它可以在過渡時期重新啓用」 - 我寧願不依靠已棄用的功能... –

+0

我剛剛堆疊了相同的問題。你可以試試$ scope。$ watch($ scope.items。$ resolved,function(){}); – acidron

回答

0

不要將承諾分配給$ scope.items,等到承諾解決後再將結果賦給$ scope.items。

api.items.query().then(function(itemsQueryResults){ 
    $scope.items = itemsQueryResults; 
}); 

當items屬性更新時Angular將像平常一樣運行摘要循環,並且您的ng-repeat將會填充。

0

在Angular 1.4.6中,我可以通過向$ watch添加第三個參數來解決此問題。請注意,我還必須通過字符串名稱引用範圍屬性:

$scope.$watch('items', function() { 
    console.log('changed'); 
}, true);