Ответы, которые были даны до сих пор, будут работать только при первом ng-repeatотображении , но если у вас есть динамика ng-repeat, это означает, что вы собираетесь добавлять / удалять / фильтровать элементы, и вы должны получать уведомления каждый раз, когда ng-repeatэти решения не будут работать для вас.
Итак, если вам нужно КАЖДЫЙ ВРЕМЯ быть уведомленным о том, что ng-repeatрендеринг повторяется, а не только в первый раз, я нашел способ сделать это, он довольно «хакерский», но он будет работать нормально, если вы знаете, что вы делаете. делает. Используйте это $filterв вашем, ng-repeat прежде чем использовать любой другой$filter :
.filter('ngRepeatFinish', function($timeout){
return function(data){
var me = this;
var flagProperty = '__finishedRendering__';
if(!data[flagProperty]){
Object.defineProperty(
data,
flagProperty,
{enumerable:false, configurable:true, writable: false, value:{}});
$timeout(function(){
delete data[flagProperty];
me.$emit('ngRepeatFinished');
},0,false);
}
return data;
};
})
Это будет $emitсобытие, вызываемое ngRepeatFinishedкаждый раз, когда ng-repeatрендерится.
Как это использовать:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
В ngRepeatFinishпотребности фильтра должны применяться непосредственно к Arrayили Objectопределено в вашем$scope , вы можете применить другие фильтры после.
Как НЕ использовать это:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Не применяйте сначала другие фильтры, а затем применяйте ngRepeatFinishфильтр.
Когда я должен использовать это?
Если вы хотите применить определенные стили CSS в DOM после завершения рендеринга списка, потому что вам нужно учитывать новые измерения элементов DOM, которые были перерисованы ng-repeat . (Кстати: такого рода операции должны выполняться внутри директивы)
Что НЕ ДЕЛАТЬ в функции, которая обрабатывает ngRepeatFinishedсобытие:
Не выполняйте $scope.$applyв этой функции, иначе вы поместите Angular в бесконечный цикл, который Angular не сможет обнаружить.
Не используйте его для внесения изменений в $scopeсвойства, потому что эти изменения не будут отражены в вашем представлении до следующего $digestцикла, и поскольку вы не можете выполнить $scope.$applyих, они не будут иметь никакого смысла.
«Но фильтры не предназначены для такого использования !!»
Нет, это не хак, если вам не нравится, не используйте его. Если вы знаете лучший способ сделать то же самое, пожалуйста, дайте мне знать.
Подведение итогов
Это хак , и использование его неверным способом опасно, используйте его только для применения стилей после того, ng-repeatкак закончите рендеринг, и у вас не должно быть никаких проблем.
element.ready()фрагмента? Я имею в виду ... это какой-то плагин jQuery, который у вас есть, или он должен быть запущен, когда элемент готов?