2014-06-21 172 views
0

我想觀察$ scope上的一個簡單對象,但我很困惑,爲什麼以下總是爲國家和州選擇元素輸出state:{value}

angular.module('app').controller('FiltersCtrl', ['$scope', 'filterRepo', function ($scope, filterRepo) { 

    $scope.data = { 
     lookups: { 
      countries: [ 
       { id: 1, name: 'USA' }, 
       { id: 2, name: 'Canada' }, 
       { id: 3, name: 'Mexico' } 
      ], 
      states: [ 
       { id: 1, name: 'Oregon' }, 
       { id: 2, name: 'Texas' }, 
       { id: 3, name: 'Iowa' } 
      ] 
     } 
    }; 

    $scope.query = { 
     filter: { 
      country: 1, 
      state: 1 
     } 
    }; 

    for (var item in $scope.query.filter) { 
     $scope.$watch('query.filter.' + item, function (newValue, oldValue) { 
      if (newValue !== oldValue) { 
       console.log(item + ' : ' + newValue); 
      } 
     }, false); 
    } 

}]); 
+2

你不能安全的'$ watch'回調內部使用'item',因爲它的價值將發生變化到最後當回調運行時可能的鍵('狀態')。 –

+0

小提琴http://jsfiddle.net/E62VE/ – PixnBits

+0

@still_learning那麼我如何獲得對已更改對象的引用? – Sam

回答

2

向來自上述@still_learning在comment擴大,只有Function■找範圍,這意味着回調到您的$watch語句使用您在「父」函數聲明的item變量。但是,當這些$ watch回調被調用/調用時,for循環已經更新了它們的值。在EffectiveJsItem 13)中有關於此的項目。

一個很好的答案是通過.forEach使用功能閉包的功能。兩個缺點:

  1. 僅限Array小號
  2. 只有在最新的瀏覽器

角度提供了一個非常方便的方法angular.forEach,以解決這兩個問題。

這一切聽起來粗糙:)但在小提琴看看它在行動:http://jsfiddle.net/E62VE/3/

相關問題