基本上我想要这个http://plnkr.co/edit/3yfXbo1c0llO40HZ8WNP?p=preview,但是当我改变一些东西时,手表不会触发。
我知道这是可行的
$scope.$watch('stuff', function (newVal, oldVal) {
console.log(oldVal, newVal);
}, true);
但是,由于我想在手表内部做一些求和,并且我不想不必要地循环遍历或重新求和未更改的值。
//edit -请注意,plnkr示例只是从实际应用程序中提取出来的,您可以在其中添加和删除行以及更多内容,比如从ng-repeat之外的另一个输入修改总数(某些东西和一些东西的总和)。
发布于 2013-03-20 20:57:09
我不会做观察,因为根据您的数组可能有多大,可能会非常繁重。相反,我只需要创建一个过滤器:
HTML:
Sum of something is: {{ stuff | sum:'something' }}<br/>
Sum of somethingelse is: {{ stuff | sum:'somethingelse' }}
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;
}
})
发布于 2013-03-20 20:16:08
在我为你的问题想出了这个解决方案后,我满脸微笑。这个解决方案不仅要观察单个对象,它也不会对求和的其余对象进行完整的循环。
http://plnkr.co/edit/oPWobcLLtJlxs5vjTYyc?p=preview
app.controller('MainCtrl', function($scope) {
$scope.stuff = STUFF;
var i;
$scope.sumOfSomething = 0;
$scope.sumOfSomethingElse = 0;
for(i=0;i < $scope.stuff.length;i++ ){
$scope.$watch('stuff['+i+'].something', function (newVal,oldVal) {
// happens when the watch is registered.
if(oldVal === newVal){
$scope.sumOfSomething += +newVal;
return;
}
if(newVal){
$scope.sumOfSomething += + (newVal - oldVal);
}
});
$scope.$watch('stuff['+i+'].somethingelse', function (newVal,oldVal) {
// happens when the watch is registered.
if(oldVal === newVal){
$scope.sumOfSomethingElse += +newVal;
return;
}
if(newVal){
$scope.sumOfSomethingElse += + (newVal - oldVal);
}
});
}
});
顺便说一句,如果你在STUFF
中有大量的对象,我不知道这个解决方案会有多优。此外,如果STUFF
中的对象数量要更改,这也不会起作用。我们基本上要做的是使用angular的脏检查循环来为我们做求和。
还要注意监视侦听器中newVal和oldVal的顺序。您点的菜是错的。
发布于 2014-02-13 06:40:19
由于$watch()
采用角度表达式,因此您可以使用自定义观察器函数。在您的例子中,观察变化的最简单方法是简单地将您感兴趣的所有字段相加,然后返回单个数字,这对于angular来说是很好和有效的,并且您的总和将准备好呈现。
var sumThings = function(obj, field) {
var val = 0;
obj.forEach(function(o) {
val += parseInt(o[field]);
});
return val;
};
$scope.$watch(function() { return sumThings($scope.stuff, "something")}, function (newVal, oldVal) { //console.log("watchExpression('something') fired!", oldVal, newVal);
$scope.somethingSum = newVal;
});
$scope.$watch(function() { return sumThings($scope.stuff, "somethingelse")}, function (newVal, oldVal) {
$scope.somethingelseSum = newVal;
});
基本上,通过做求和,你就是在做你自己的脏检查。如果您的对象比这里显示的对象更复杂,那么它将比$watch(STUFF, true)
更有效。
更新的plnkr:http://plnkr.co/edit/d7CvERu3XGkub4l6f1yw?p=preview
https://stackoverflow.com/questions/15522015
复制相似问题