fxc*_*xck 16 javascript object watch angularjs angularjs-scope
基本上我想要这个http://plnkr.co/edit/3yfXbo1c0llO40HZ8WNP?p=preview但是当我改变东西时手表不会触发..
我知道这会奏效
$scope.$watch('stuff', function (newVal, oldVal) {
console.log(oldVal, newVal);
}, true);
Run Code Online (Sandbox Code Playgroud)
但是因为我想在手表内做一些总结而我不想不必要地循环或重新加总没有改变的值.
//编辑 - 请注意,plnkr示例只是从实际应用程序中提取,您可以在其中添加和删除行等等,例如从ng-repeat之外的另一个输入修改总数(某些事物和某些事物的总和). .
我不会做手表,因为你的阵列有多大,可能会非常费力.相反,我只想创建一个过滤器:
HTML:
Sum of something is: {{ stuff | sum:'something' }}<br/>
Sum of somethingelse is: {{ stuff | sum:'somethingelse' }}
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
.filter("sum", function(){
return function(input, params){
var totalSum = 0;
for(var x = 0; x < input.length; x++){
totalSum += input[x][params];
}
return totalSum;
}
})
Run Code Online (Sandbox Code Playgroud)
plnkr:http://plnkr.co/edit/p6kM3ampSuMXnwqcteYd?p =preview
好吧,如果我明白了,你只想在内部对象发生变化时对其进行something求和。somethingelse如果更改发生在其中一个内部对象中,则您不想循环遍历所有其他内部对象。
好吧,你$watch没有被解雇,因为没有stuff.property,也没有像 那样的模式stuff.*.something。
如果您知道对象从数组中推送或拉出的时刻,那么您可以在将$scope.$watch(object, function(){}, true)每个对象插入数组之前/之后单独应用一个。如果您不知道这一刻,那么您将需要$watch整个数组,并且当发生更改时,请$watch一一运行所有注销函数并再次运行它们。
无论如何,当今浏览器中的循环非常快,除非您正在进行繁重的计算并且您有数百万个对象(这已经是内存问题),否则您可能会很好地使用它。因此,$watch只有当您的计算量非常大(可能会影响系统性能)时,才需要分别对它们进行全部处理。