Le risposte che sono state fornite finora funzioneranno solo la prima volta che ng-repeat
vengono rese , ma se hai una dinamica ng-repeat
, il che significa che stai per aggiungere / eliminare / filtrare elementi e devi essere avvisato ogni volta che il ng-repeat
viene reso, quelle soluzioni non funzioneranno per te.
Quindi, se hai bisogno di essere avvisato OGNI VOLTA che il ng-repeat
rendering viene ridimensionato e non solo la prima volta, ho trovato un modo per farlo, è abbastanza "confuso", ma funzionerà bene se sai cosa sei facendo. Usa questo $filter
nel tuo ng-repeat
prima di usare qualsiasi altro$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;
};
})
Questo sarà $emit
un evento chiamato ngRepeatFinished
ogni volta che ng-repeat
viene reso.
Come usarlo:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Il ngRepeatFinish
filtro deve essere applicato direttamente a un Array
o un Object
definito nel tuo$scope
, puoi applicare altri filtri dopo.
Come NON usarlo:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Non applicare prima altri filtri e quindi applicare il ngRepeatFinish
filtro.
Quando dovrei usare questo?
Se si desidera applicare determinati stili CSS nel DOM dopo che l'elenco ha terminato il rendering, poiché è necessario tenere conto delle nuove dimensioni degli elementi DOM che sono stati renderizzati nuovamente da ng-repeat
. (A proposito: quel tipo di operazioni dovrebbe essere fatto all'interno di una direttiva)
Cosa NON FARE nella funzione che gestisce l' ngRepeatFinished
evento:
Non eseguire a $scope.$apply
in quella funzione o inserirai Angular in un loop infinito che Angular non sarà in grado di rilevare.
Non utilizzarlo per apportare modifiche alle $scope
proprietà, poiché tali modifiche non si rifletteranno nella vista fino al $digest
ciclo successivo e poiché non è possibile eseguirle $scope.$apply
, non saranno di alcuna utilità.
"Ma i filtri non sono fatti per essere usati così !!"
No, non lo sono, questo è un trucco, se non ti piace non usarlo. Se conosci un modo migliore per realizzare la stessa cosa, per favore fatemelo sapere.
Riassumendo
Questo è un trucco e usarlo nel modo sbagliato è pericoloso, usalo solo per applicare gli stili dopo che il ng-repeat
rendering è terminato e non dovresti avere problemi.
element.ready()
snippet? Voglio dire .. è una sorta di plugin jQuery che hai, o dovrebbe essere attivato quando l'elemento è pronto?