2014-11-24 51 views
0

我目前的角度做一個應用程序,它做到這一點:

(網頁加載)製作的角度控制器的API調用(對Symfony2的終點)得到:items

$scope.items = ItemsService.query(function(data){ 
    $scope.loading = false; 
}, function(err){ 
    $scope.loading = false; 
}); 

items是含有許多item對象陣列。 每個item包含參數例如item.param1item.param2

我建立它以類似的方式,以本教程: http://www.sitepoint.com/creating-crud-app-minutes-angulars-resource/ 即角控制器調用它調用(Symfony2的)後端API端點的服務。 端點傳回從數據庫獲取的items。然後使用ng-repeat將項目放入視圖(item in items)。

這一切工作正常。

現在,我有一個按鈕(在ng-repeat中),它有效地導致對另一個symfony2端點的PUT請求,從而更新數據庫中的item.param1。這也發生在我鏈接到的教程中。

問題是(在我的應用程序和教程中)我不得不再次進行api調用,它會更新所有項目,以便查看更改。 我想只更新視圖中的數據(立即)爲一個對象,而不必再次獲取它們。 即是這樣的:

$scope.items[4] = Items.get({id: item.id}, function(){}); 

除了應用陣列關鍵是不知道,所以我不能做到這一點。 (所以像:?$scope.items.findTheOriginalItem(item) = Items.get({id: item.id}, function(){});

另一種可能的解決方案(這似乎是它可能是最好的),我已經在這裏看了: http://teropa.info/blog/2014/01/26/the-three-watch-depths-of-angularjs.html ,並試圖做平等$表:$scope.$watch(…, …, true);因此,使用的手錶看當item子陣列被更新時,雖然它看起來沒有更新視圖中的數據(儘管它正在數據庫中更新)

任何有關這樣做的最佳方法的建議(以及如何做到這一點)將是偉大的!謝謝!

+0

如果你知道什麼是對你的項目改變爲什麼你需要在提出的要求服務器?只需更新視圖(因爲無論如何你都會更新服務器,你會保持一致我猜) – 2014-11-24 21:14:52

+0

我需要向服務器發出請求,以便服務器可以更新數據庫! 問題是,當數據庫更新時,它不會立即反映在視圖中(這就是爲什麼我需要再次調用重新獲取項目(最好不要進行此調用,只是反映在視圖中,因爲正確的數據已經存在)) – timhc22 2014-11-24 22:31:27

+0

您是否在更改後嘗試使用'scope.digest()'? – 2014-11-24 22:33:15

回答

1

本質上按鈕點擊sho使用ng-click執行一個函數並將該項傳遞給該函數。例如:

...ng-repeat="item in items"... <button type="button" ng-click="updateItem(item)">Update</button ...

然後在功能你必須要更新的具體項目。如果你正在使用$資源,這將是這樣的:

$scope.updateItem = function(item) { item.$update(...); };

除非我不明白你

+0

是的,謝謝你的幫助! – timhc22 2014-11-25 11:52:05

+0

我現在遇到的問題是,它在視圖中顯示爲已更新,並且顯然是發送PUT請求(可以使用chrome的網絡選項卡查看),但它不會被後端接收。 (雖然GET請求)。文檔和教程略有混淆,因爲有人說使用.update,另一個說使用$ update(.update將對象傳遞給服務,而不是。$ update對象本身就是我正在使用的)。關於爲什麼後端不接收來自前端的任何數據的請求的任何想法? – timhc22 2014-11-25 11:54:12

+0

這是代碼: ItemsService.update({ID:item.id},項,功能(){$ = scope.loading假; },函數(ERR){$ = scope.loading假; item.param1 = true; //如果失敗返回true }); – timhc22 2014-11-25 11:55:06