ожидает обновления отфильтрованной модели $ scope

#angularjs #angularjs-ng-repeat

#angularjs #angularjs-ng-repeat

Вопрос:

Я использую ng-repeat и настраиваю переменную $ scope в моей отфильтрованной коллекции

 <tr ng-repeat="r in filteredData = (data | filter: {Number: num} | filter: eFilter)">
  

В моем контроллере:

         $scope.num = undefined;
        console.log($scope.filteredData.length); //returns 10
        $scope.num = 2
        console.log($scope.filteredData.length); //expecting 5
        $scope.num = undefined;
        console.log($scope.filteredData.length); //expecting 10, however, it  actually      returns 5. 
  

Если я установлю для нее тайм-аут, например, приведенный ниже, я получу ожидаемое значение 10. Я бы предпочел не использовать тайм-аут — я уверен, что есть какая-то угловая функция, которую я могу вызвать, возможно, та, которая запускает цикл дайджеста? Надеюсь, кто-нибудь сможет объяснить, как правильно дождаться обновления $ scope.filteredData, чтобы отразить изменение фильтра.

         setTimeout(function () { console.log($scope.filteredData.length); }, 1); // returns 10
  

Комментарии:

1. Искомая вами функция angular — это $timeout ; если вы используете ее с задержкой, равной нулю, она будет ждать до следующей $digest (сверх этого нет необходимости в произвольном дополнительном времени.)

2. Как же так? «Оболочка Angular для window.setTimeout» — похоже, это то же самое, что я делаю выше

3. В значительной степени, да. Вам нужно отложить что-то до следующего дайджеста, $ timeout — это угловой способ сделать это. Преимущество, которое он имеет перед ванильным setTimeout, заключается в том, что он не сломается, если ваши $ digests занимают больше времени, чем любая используемая вами задержка setTimeout.

4. (В качестве альтернативы вы можете принудительно выполнить дайджест, используя $scope.$apply; обычно я считаю, что это приводит к проблемам с производительностью, но в некоторых случаях это может быть предпочтительнее.)