首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅针对特定对象属性的Angular.js监视

仅针对特定对象属性的Angular.js监视
EN

Stack Overflow用户
提问于 2013-03-20 19:17:13
回答 4查看 13.9K关注 0票数 16

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

我知道这是可行的

代码语言:javascript
复制
$scope.$watch('stuff', function (newVal, oldVal) {
    console.log(oldVal, newVal);

}, true);

但是,由于我想在手表内部做一些求和,并且我不想不必要地循环遍历或重新求和未更改的值。

//edit -请注意,plnkr示例只是从实际应用程序中提取出来的,您可以在其中添加和删除行以及更多内容,比如从ng-repeat之外的另一个输入修改总数(某些东西和一些东西的总和)。

EN

回答 4

Stack Overflow用户

发布于 2013-03-20 20:57:09

我不会做观察,因为根据您的数组可能有多大,可能会非常繁重。相反,我只需要创建一个过滤器:

HTML:

代码语言:javascript
复制
Sum of something is: {{ stuff | sum:'something' }}<br/>
Sum of somethingelse is: {{ stuff | sum:'somethingelse' }}

Javascript:

代码语言: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

票数 6
EN

Stack Overflow用户

发布于 2013-03-20 20:16:08

在我为你的问题想出了这个解决方案后,我满脸微笑。这个解决方案不仅要观察单个对象,它也不会对求和的其余对象进行完整的循环。

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

代码语言:javascript
复制
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的顺序。您点的菜是错的。

票数 4
EN

Stack Overflow用户

发布于 2014-02-13 06:40:19

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15522015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档