16

基本上我想要这个http://plnkr.co/edit/3yfXbo1c0llO40HZ8WNP?p=preview但是当我改变一些东西时手表不会触发..

我知道这会奏效

$scope.$watch('stuff', function (newVal, oldVal) {
    console.log(oldVal, newVal);

}, true);

但是因为我想在手表内部做一些总结,我不想不必要地循环或重新总结没有改变的值..

//edit - 请注意,plnkr 示例只是从实际应用程序中提取的,您可以在其中添加和删除行等等,例如从 ng-repeat 之外的另一个输入中修改总数(某事和某事的总和)。 .

4

4 回答 4

6

我不会做手表,因为这取决于您的阵列有多大,可能会非常费力。相反,我只会创建一个过滤器:

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;
    }
})

plnkr:http ://plnkr.co/edit/p6kM3ampSuMXnwqcteYd?p=preview

于 2013-03-20T12:57:08.767 回答
4
于 2013-03-20T12:16:07.517 回答
3

由于$watch()采用角度表达式,您可以使用自定义观察器函数。在您的情况下,观察更改的最简单方法是将所有您感兴趣的字段相加,然后返回一个对角度来说很好且有效的数字,并且您的总和将准备好呈现。

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

于 2014-02-12T22:40:18.587 回答
1

好吧,如果我明白了,您只想在内部对象发生变化时对其进行something求和somethingelse。如果更改发生在其中一个对象中,您不想遍历所有其他内部对象。

好吧,你$watch不是因为没有stuff.property,也没有像stuff.*.something.

如果您知道对象从阵列中推入或拉出的那一刻,则可以$scope.$watch(object, function(){}, true)在将每个对象插入阵列之前/之后分别应用。如果您不知道这一刻,那么您将需要$watch整个阵列,并且当发生更改时,请$watch一个接一个地运行所有注销函数并再次运行它们。

无论如何,现在浏览器中的循环非常快,除非您进行大量计算并且您拥有数百万个对象(这已经是内存问题),否则您可能会很好用它。因此,$watch只有在您进行大量计算时才需要对它们进行单独处理,这可能会影响系统性能。

于 2013-03-20T12:10:28.320 回答