angularjs:多个手表

时间:2013-09-26 06:22:47

标签: javascript angularjs

我有以下手表:

 $scope.$watch('[gridService.gridOptions.pagingOptions.currentPage, gridService.gridOptions.pagingOptions.pageSize]', function (newVal, oldVal, e) {
     if (newVal !== oldVal) {
          $scope.search();
     }
 }, true);

我有两个问题:

  1. 如果pageSize更改,我想将currentPage的值设置为1.如果我这样做,我将在currentPage上触发监视。我该如何预防呢?

  2. 如何检查两者中的哪一个触发了手表?如果我想在pageSize更改时将currentPage设置为1,我需要知道pageSize触发了watch。在这种情况下,我需要两个单独的手表吗?

2 个答案:

答案 0 :(得分:1)

结帐这些小提琴;他们都完成了你的要求,一个是复杂的手表(与你的略有不同),一个是独立的。

http://jsfiddle.net/rZxEc/→复杂观察

http://jsfiddle.net/SM5aB/→两只手表

原理相同:一个变量,用于记住页面更改是否由页面大小更改引起。封闭的匿名函数只隐藏var triggeredByPageSize代码的其余部分:

(function() {
    var triggeredByPageSize
    // set $watches here
})();

我认为单独的手表(小提琴2)更清洁。

答案 1 :(得分:0)

在这里观察多个属性是需要考虑的两件事,你可以像这样传递一个字符串数组:

$scope.$watch('[someproperty,someproperty2,someproperty3]',function(new,old){
    //do something
},true);

最后的“true”指定您想要深度观察一个对象,所以假设您有一个包含许多子属性的大对象,并且您希望监视父对象的任何更改,包括子属性是否更改,如果如果子属性发生变化,你就不会传递它。

你问哪个人更改了arry我相信你通过在新的结尾添加索引来访问它:

$scope.$watch('[someproperty,someproperty2,someproperty3]',function(new,old){
    console.log(new[0]);
    console.log(new[1]);
},true);