2013-12-16 98 views
1

的問題是清晰可見這裏http://plnkr.co/edit/ZphAKvZeoVtuGFSEmOKg?p=previewAngularJS:手錶數組屬性

比方說,你有一個數組,看起來像這樣

var arr = [ 
{ 
    'a': "123", 
    'b': "654" 
}, 
{ 
    'a': "456", 
    'b': "321" 
} 
]; 

arr.foo = 'bar'; 

$watch火的時候,你將裏面他們一些對象(如例如arr[0].a = 'hoopidoo'),但當您更改foo時(例如arr.foo = 'deedlilaa',或通過ng-model),它不會

難道是javascript的限制嗎?我的意思是當你遍歷數組時,你只能找回對象,所以無法枚舉foo ..

檢查plunker,看看我是怎麼回事。無論您在輸入中輸入什麼或在控制器中做什麼,手錶都不會閃光。

+0

你寫的甚至不是有效的javascript,嘗試將「數組」粘貼到nodejs repl中,它不會工作,foo:'bar'不能成爲javascript數組的元素。您只能將foo定義爲對象的屬性,因爲數組是一個對象。 – mpm

+0

我認爲這是可能的寫下來,但如果不是這樣的話,它仍然是正確的,或者在這裏http://jsfiddle.net/6S738/ – foxx

+0

你改變了你的問題,我正在嘗試修改1:http://stackoverflow.com/posts/20621906/revisions,修訂1代碼不編譯,它不是有效的JavaScript。 – mpm

回答

0

(在特定的關鍵在對面的對象)來觀察數組對象屬性的唯一方法是明確$watch他們:

$scope.$watch('arr.param', function(newVal, oldVal) { 
    // Some code 
} 
arr.param = 'foobar' 

但是,如果你不關心混合數字和關聯數組鍵,你可以只改變37號線的plunker來是這樣的:

$scope.arr['param'] = "abc"; 
+0

不幸的是,我在'ng-repeat'中使用了數組,並且我只希望實際的對象出現在它中,這些屬性是幫助者的。 – foxx

+0

然後,我建議你明確地觀看你想要的Array對象屬性。 Afaik沒有其他解決方案來解決您的問題。 –

+0

要麼是具有此屬性的輸入,要麼是ng-change,這會調用與watch相同的函數。 – foxx

-1

JavaScript數組不允許使用「字符串索引」。 arr.fooarr的類型從Array轉換爲Object

+0

是嗎?那你怎麼還能「推」它呢? – foxx

+0

可能讓你和我自己感到困惑,就像我在SA上寫下來的那樣,這是完全無效的javascript。儘管如此,這是對的。我已經更新了這個問題。 – foxx

+0

'a = []; a.foo = 1; Array。IsArray的(一); // true 一個instanceof Array; // true' – Kosmotaur

0

使用:

$scope.$watchCollection 

特別是您可以使用$ watchColletion觀察範圍內的變量,並更新您的按鈕或任何您需要的東西。

$scope.$watchCollection(function() { 
    if ($scope.myForm) 
     return $scope.myForm; 
}, function() { 
    if ($scope.myForm) 
    if (($scope.myForm.$invalid == true)) 
      $scope.formValidityChange(true); 
    else 
     $scope.formValidityChange(false); 
}, true); 

這將檢查窗體內部發生變化的所有變量,並且您將更新控制器。我想你也可以通過比較這兩個物體來檢查發生了什麼變化,這可能會更困難。