2014-02-25 140 views
1

我正在$我的$ scope.randomObjects中觀看我的指令。如果函數不穩定,$ watch將拋出錯誤,我認爲getDesiredAmountOfObjects中的curried函數是冪等的。在這裏,ngResource是我無法看到的對象嗎? 我該如何解決這個問題?此外,desiredAmount現在是固定的。

這裏是我的控制器片段:

.. 
     var getDesiredAmountOfObjects = function (objects, randomObjects) { 
      return function (desiredAmount) { 
       var amount = desiredAmount || 1; 

       if (amount >= objects.length) { 
        return objects; 
       } 

       var randoms = randomObjects.slice(0, amount); 

       //logged objects are always the same in each $digest loop. 
       //including the $$hashKey 
       console.log(random); 

       return randoms; 
      }; 
     }; 

     //this will initialized only once in controller 
     ObjectRes.query(function(data) { 
      $scope.objects = data; 
      var randomObjects = []; 
      angular.extend(randomObjects, data); 
      randomObjects.sort(function() { 
       return 0.5 - Math.random(); 
      }); 


      $scope.randomObjects = getDesiredAmountOfObjects($scope.objects, randomObjects); 
     }); 

.. 

回答

1

我無法看到的一切,因爲我還沒有看到$watch和意見是如何設置的事,但我跳了出來。

如果randomObjects正在從一個觀察器內被調用,並且被設置爲也被觀察的範圍上的值,則將導致無限的$digest循環。

這是因爲你不斷返回一個新的數組引用(slice返回一個新的數組)。結果的觀察者將認識到參考文獻已改變,這將需要新的摘要循環,這將要求新的randomObjects這將觸發某些變化等。

通常,您通過確保您的函數返回對同一個對象的引用,並且不會創建新的數組。在你的情況下,你打電話slice每次創建一個新的陣列。您需要確保此函數每次都返回相同的數組。

可能是這樣的嗎?

var getDesiredAmountOfObjects = function (objects, randomObjects) { 
     var result = []; 

     return function (desiredAmount) { 
      var amount = desiredAmount || 1; 

      if (amount >= objects.length) { 
       return objects; 
      } 

      // clear the result array and put randoms into it 
      result.length = 0; 
      result.push.apply(result, randomObjects.slice(0, amount)); 

      //logged objects are always the same in each $digest loop. 
      //including the $$hashKey 
      console.log(result); 

      return result; 
     }; 
    }; 
+1

非常感謝您的時間和知識!這很好用! 我覺得這種方式太多,沒有看到明顯的。 TIL角正在觀察實際的對象,而不僅僅是$$ hashKey。 – pasuna

+0

是的,我一直陷入這個問題。我在功能上編寫我的代碼,並且我不認爲維護Angular的監視系統所需的參照完整性。 –