Фильтр $stateful AngularJS с зацикливанием $timeout

Я пытаюсь создать фильтр с отслеживанием состояния с помощью AngularJS, чтобы в конечном итоге вызвать службу, которая будет возвращать данные асинхронно. Чтобы проверить это, я просто использую простую функцию $timeout, которая console.log записывает строку. Однако этот console.log работает бесконечно.

export default angular.module('components.filters.combine-name', [])

.filter('combineName', ['$timeout', function ($timeout) {
  function combineName(input) {
    $timeout(function () {
      console.log('test');
    }, 1000);
    return input.firstName + ' ' + input.lastName;
  }

  combineName.$stateful = true;
  return combineName;
}]);

HTML

<table class="table table-bordered table-striped table-responsive">
    <thead>
    <tr>
      <th>
        <div class="th">
          Name
        </div>
      </th>
      <th>
        <div class="th">
          Status
        </div>
      </th>
    </tr>
    </thead>
    <tbody>
    <tr ng-repeat="result in vm.results">
      <td>{{result | combineName}}</td>
      <td>{{result.status}}</td>
    </tr>
    </tbody>
</table>

контроллер:

this.results = [
  {
    firstName: 'Johnny',
    lastName: 'Utah',
    status: 'Active'
  },
  {
    firstName: 'Richard',
    lastName: 'Reynolds',
    status: 'Inactive'
  },
  {
    firstName: 'Randy',
    lastName: 'Johnson',
    status: 'Active'
  }
];

person Daniel Bogart    schedule 29.03.2016    source источник
comment
$timeout запускает дайджест, фильтр запускает каждый дайджест... это бесконечный цикл   -  person Petr Averyanov    schedule 30.03.2016


Ответы (1)


С помощью $timeout вы фактически включаете зацикливание, и оно будет продолжаться, пока вы не скажете ему остановиться.

Внутри вашего цикла используйте: $timeout.cancel();

person therebelcoder    schedule 29.03.2016