2014-10-30 53 views
0

我只需要從範圍內的項目中刪除屬性。 沒有$scope.$apply(),該屬性未被刪除。 使用$apply時,出現錯誤「[$ rootScope:inprog] $ apply already progress in progress」。

爲什麼,那麼做到這一點的「正確」方法是什麼?

$scope.loadPreset = function($event){ 
     angular.forEach($scope.presets, function(preset, key) { 
      if($scope.presets[key].hasOwnProperty('loadStatus')) { 
       delete $scope.presets[key].loadStatus; 
       $scope.$apply(); 
      } 
     }); 
    }; 

(這個工作,但拋出一個「$已經申請中」錯誤)

沒有$apply,財產沒有被清除。而下面的(奇怪)無法正常工作或:

$scope.$apply(function(){ 
    delete $scope.presets[key].loadStatus 
}); 

的功能是直接從hg-click指令調用。

(編輯基礎上的評論)

+1

'$這裏不需要apply'除非'loadPreset'跳閘外消化週期(這顯然不是,因此你的錯誤) - 你怎麼知道這個密鑰沒有被刪除? – tymeJV 2014-10-30 15:05:18

+0

這也是我的想法,但沒有它就無法工作。密鑰永遠不會被刪除:-)。至少現在,這是一個後來的擔心。 – Pim 2014-10-30 15:08:17

+0

反正你似乎有一個奇怪的錯字。 '$ scope。$ apply'需要一個函數。你通過它'刪除$ scope.presets [key] .loadStatus'。另外,爲什麼你不能使用'$ scope.presets [key] .loadStatus = null;刪除$ scope.presets [key] .loadStatus'(不適用) – Ian 2014-10-30 15:13:29

回答

1

嘗試包裝整個foreach在應用函數。除非它需要很長的時間進行迭代的預設,沒有真正的理由在循環運行的每個項目:

$scope.loadPreset = function($event){ 
    $scope.$apply(function(){ 
     angular.forEach($scope.presets, function(preset, key) { 
      if($scope.presets[key].hasOwnProperty('loadStatus')) { 
       delete $scope.presets[key].loadStatus 
      } 
     }); 
    }); 
    }; 
+0

絕對是一個很好的建議,但會**修復**發生了什麼?它只是看起來像一個優化 – Ian 2014-10-30 15:31:50

+0

感謝您的建議,但同樣的事情在這裏:屬性沒有得到刪除出於某種原因。有趣的是,根據如何使用'$ scope。$ apply',它似乎工作與否。直接調用'$ scope。$ apply()'而不用函數作爲參數,或者'$ scope。$ apply(delete ...)'(這基本上是錯誤的語法,但是可行)。 – Pim 2014-10-30 15:38:17

相關問題