#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; обычно я считаю, что это приводит к проблемам с производительностью, но в некоторых случаях это может быть предпочтительнее.)