Ответы, которые были даны до сих пор, будут работать только при первом 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, который у вас есть, или он должен быть запущен, когда элемент готов?