ng-repeat最终回调事件

时间:2015-12-10 19:29:12

标签: javascript angularjs

我需要编写一个回调方法,每次调用ng-repeat时都会触发该方法。

从互联网上获得了几个选项

1. ng-init on ng-repeat

此处使用ng-init属性

调用该方法
<ol ng-repeat="record in records | orderBy: sortCol:true" ng-init="$last && callMethod()">

2.使用自定义指令

HTML:

<ol ng-repeat="record in records| orderBy: 'name'" on-last-repeat>

AngularJs

  angular.module('myapp', [])  
    .directive('onLastRepeat', function() {
        return function(scope, element, attrs) {
            if (scope.$last) setTimeout(function(){
                scope.$emit('onRepeatLast', element, attrs);
            }, 1);
        };
    })

.controller('Ctrl', function($scope, $http) {
    $scope.records = [];
    $scope.$on('onRepeatLast', function(scope, element, attrs){
        //work your magic
    });
    $http.get('/path/to/record.json')
      .success(function(data) {
          $scope.records = data;
      })
  });

但是我的问题是它们都只是在初始触发一次(正如名字ng-init明显暗示的那样)。我希望只要sortColumn或sortOrder(asc或desc)或数据(记录)发生变化就会调用该方法。但上述两种方法都无法解决我的问题。

帮助很受欢迎??

3 个答案:

答案 0 :(得分:1)

记录变更。你试过用$ watch方法吗?

$scope.$watch('records.length', function(newArray, oldArray){
    //Do something
},true);

答案 1 :(得分:1)

由于手表仅监视参考更改,我认为您的解决方案将是 $ watchCollection()

答案 2 :(得分:1)

我已使用以下代码解决了该问题:

<强> HTML:

<ol ng-repeat="record in ($parent.newItems = (records | orderBy: sortCol:true))">

<强> AngularJs:

$scope.$watchCollection('newItems ', function(newCollection, oldCollection) {
        newCollection && newCollection.length>0 && $scope.doSomething();
});