如果你的代碼真的是這樣的:
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
與自定義指令結合起來,以更清晰的方式得到你想要的。
比較'newValue'到'oldValue' – charlietfl 2014-09-27 15:21:33
我想知道哪個屬性已經改變......沒有改變的值(這是我正確地得到它)。請閱讀 – nirajkumar 2014-09-27 15:26:29
這個問題,你需要循環訪問屬性並比較 – charlietfl 2014-09-27 15:27:50