2014-09-27 77 views
0

我正在編寫一個程序,在該程序中查看範圍內的數組。 Scope.watch根據需要工作,這給了我修改後的值。但是,如何找出哪個元素已被更改?AngularJS Scope查看更改了哪些綁定屬性

for(var i=0; i<5; i++) { 
    myarray[i] = "var_" + i; 
} 

Scope.$watch(myarray[i], function (newValue,OldValue) { 
    alert(myarray[i]); // Doesn't give me the correct value changed attributes because i has been modified 
}); 

如何知道哪些屬性已被更改,例如:var_1,var_2?

+2

比較'newValue'到'oldValue' – charlietfl 2014-09-27 15:21:33

+0

我想知道哪個屬性已經改變......沒有改變的值(這是我正確地得到它)。請閱讀 – nirajkumar 2014-09-27 15:26:29

+1

這個問題,你需要循環訪問屬性並比較 – charlietfl 2014-09-27 15:27:50

回答

0

我發現這個$scope.$$watcher的解決方案包含範圍正在監視的所有屬性。遍歷$$觀察者並檢查它的最後一個值($watch.last),然後在eval中有屬性的名稱。因此,將newvalue與$ watch.last屬性進行比較,並從watch中獲取屬性的名稱。

我會盡快修改這個答案與例如:Code

2

如果你的代碼真的是這樣的:

for(var i=0;i<5;i++) 
{ 
    myarray[i] = "var_" + i; 
} 

Scope.$watch(myarray[i], function (newValue,OldValue) { 
    alert(myarray[i]) 
} 

那麼答案很簡單。當var_4更改時,您的手錶始終會觸發。

這是爲什麼?

這是因爲您正在創建for循環範圍之外的手錶。由於變量作用域在JavaScript中的工作方式,循環變量的作用範圍是該函數,因此您的代碼仍然有效,但不會達到您所期望的效果--中i的值將是循環中的最後一個值。

如果要指定變量的作用域到環路內看,你會做這樣的事情:

for(var i=0;i<5;i++) 
{ 
    myarray[i] = "var_" + i; 

    Scope.$watch(myarray[i], function (varName) { 
     return function (newValue,OldValue) { 
      alert(varName + "changed, new value: " + newValue); 
     } 
    }("var_" + i)); 
} 

這將創建一個新的手錶每次循環迭代,並通過變量名通過中間函數範圍將確保它是正確的。

說了這麼多,我相當肯定你做錯了如果你發現自己需要創建一個循環手錶。如果你想解釋你正在努力完成什麼,我們可能會提供一個更有意義的答案。舉例來說,如果你想觀看範圍變量VAR_1和VAR_2,你可以簡單地說:

Scope.$watch("var_1", function (newValue,OldValue) { 
    alert("var_1 changed: " + myarray[i]) 
} 

Scope.$watch("var_2", function (newValue,OldValue) { 
    alert("var_2 changed: " + myarray[i]) 
} 

如果你需要觀察更改任意長度的數組,知道改變的指標,你可以試試這個:

function firstDifferetIndex(a1, a2) { 
    for (var i = 0; i < a1.length; i++) { 
     if (a1[i] != a2[i]) { 
      return i; 
     } 
    } 
    return -1; 
} 

Scope.$watchCollection("[" + myarray.join(",") + "]" , function (new, old) { 
    var changedIndex = firstDifferentIndex(new, old); 
    alert("var_" + changedIndex + " changed"); 
}); 

我仍然相當確定這不是你想實際做的事情,但是考慮到我們在問題上獲得的大量信息,這是我能做的最好的。但我猜你可能想要將ng-repeat與自定義指令結合起來,以更清晰的方式得到你想要的。

+0

我有4-5屬性都是文本值。我想知道哪些屬性已經改變。在手錶內部,我確實得到了正確的更改值,但我不確定哪個屬性的值已經改爲5. – nirajkumar 2014-09-27 16:00:16

+0

爲什麼不簡單地爲每個要觀察的屬性設置一個手錶? – Rytmis 2014-09-27 17:29:52

+0

,因爲這些將被動態設置並可能是40-50個屬性 – nirajkumar 2014-09-27 17:49:41

0

你可以使用一個黑客:Demo

scope.myArray = []; 

for(var i=0; i<5; i++) { 
    scope.myArray[i] = { text: "var_" + i, id: i }; 

    scope.$watch("myArray." + i, function (new, old) { 
     console.log("Changed Variable", scope.myArray[new.id].text); 
     console.log("Index", old.id); // Or new.id as long as you don't modify them. 
    }, true); 
} 

所以,如果你需要找出哪些因素髮生變化時,使用old.idnew.id