Le risposte che sono state fornite finora funzioneranno solo la prima volta che ng-repeatvengono 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-repeatviene reso, quelle soluzioni non funzioneranno per te.
Quindi, se hai bisogno di essere avvisato OGNI VOLTA che il ng-repeatrendering 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 $filternel 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à $emitun evento chiamato ngRepeatFinishedogni volta che ng-repeatviene reso.
Come usarlo:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Il ngRepeatFinishfiltro deve essere applicato direttamente a un Arrayo un Objectdefinito 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 ngRepeatFinishfiltro.
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' ngRepeatFinishedevento:
Non eseguire a $scope.$applyin quella funzione o inserirai Angular in un loop infinito che Angular non sarà in grado di rilevare.
Non utilizzarlo per apportare modifiche alle $scopeproprietà, poiché tali modifiche non si rifletteranno nella vista fino al $digestciclo 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-repeatrendering è 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?