如何在ng-repeat过滤器启动之前执行$ watch回调?

时间:2014-03-04 14:39:30

标签: angularjs angularjs-directive angularjs-scope

我有一个ng-repeat循环使用过滤器的资源对象数组,就像这样。

<div ng-repeat='item in items | filter: { hidden: false}'>
  <div my-custom-directive ng-model='item'></div>
</div>

然后,在指令中,我想监视每个资源对象的变化。

myApp.directive('myCustomDirective', function(){
  return {
    restrict: 'A',
    replace: true,
    scope: {
      myDirectiveItem: '=ngModel'
    },
    template: '<button ng-click="myCustomDirective.hidden = true">Hide</button>',
    link: function(scope) {
      scope.$watch('myDirectiveItem', function(oldValue, newValue){
        console.log('I have changed'); // Never called
      }, true);
    }
  };
});

但$ watch回调永远不会被称为更改对象。我假设这是因为,在循环中,过滤器优先,因此监视的资源对象不再在该范围内可用。

如何在从集合中删除对象之前强制执行$ watch回调?

//编辑

我想指出,如果我在代码中删除| filter: { hidden: false },一切都按预期工作,并显示I have changed。它只适用于过滤器。

1 个答案:

答案 0 :(得分:0)

你可以尝试这个:

myApp.directive('myCustomDirective', function(){
  return {
    restrict: 'A',
    replace: true,
    scope: {
      myDirectiveItem: '=ngModel'
    },
    template: '<button ng-click='item.hidden = true'>Hide</button>',
    link: function(scope) {

    // check that all items in ng-repeat loaded  
    if (scope.$last) {
        // watch scope.myDirectiveItem
        scope.$watch(scope.myDirectiveItem, function(oldValue, newValue){
          console.log('I have changed'); // Never called
        }, true);
      }          
    }
  };
});