Die bisher gegebenen Antworten funktionieren nur beim ersten ng-repeatRendern . Wenn Sie jedoch eine Dynamik haben ng-repeat, bedeutet dies, dass Sie Elemente hinzufügen / löschen / filtern, und Sie müssen jedes Mal benachrichtigt werden, wenn die ng-repeatWird gerendert, funktionieren diese Lösungen nicht für Sie.
Also, wenn Sie JEDES MAL benachrichtigt werden müssen , dass die ng-repeatbekommt erneut gerendert und nicht nur das erste Mal habe ich einen Weg gefunden , das zu tun, es ist ziemlich ‚Hacky‘, aber es wird gut funktionieren , wenn Sie wissen , was Sie sind tun. Verwenden Sie dies $filterin Ihrem, ng-repeat bevor Sie andere verwenden$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;
};
})
Dies ist $emitein Ereignis, das ngRepeatFinishedjedes Mal aufgerufen wird, wenn das ng-repeatgerendert wird.
Wie man es benutzt:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Der ngRepeatFinishFilter muss direkt auf einen Arrayoder einen Objectin Ihrem definierten Filter angewendet werden. Anschließend $scopekönnen Sie andere Filter anwenden.
Wie man es NICHT benutzt:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Wenden Sie nicht zuerst andere Filter an und wenden Sie dann den ngRepeatFinishFilter an.
Wann soll ich das benutzen?
Wenn Sie nach Abschluss des Renderns der Liste bestimmte CSS-Stile auf das DOM anwenden möchten, müssen Sie die neuen Dimensionen der DOM-Elemente berücksichtigen, die vom erneut gerendert wurden ng-repeat. (Übrigens: Diese Art von Operationen sollten innerhalb einer Richtlinie durchgeführt werden.)
Was Sie in der Funktion, die das ngRepeatFinishedEreignis behandelt, NICHT tun sollten :
Führen Sie $scope.$applyin dieser Funktion keine aus, da sonst Angular in eine Endlosschleife versetzt wird, die Angular nicht erkennen kann.
Verwenden Sie es nicht, um Änderungen an den $scopeEigenschaften vorzunehmen , da diese Änderungen erst in der nächsten $digestSchleife in Ihrer Ansicht wiedergegeben werden und da Sie keine Änderungen vornehmen können, sind $scope.$applysie nicht von Nutzen.
"Aber Filter sollen nicht so verwendet werden !!"
Nein, das sind sie nicht. Dies ist ein Hack. Wenn Sie ihn nicht mögen, verwenden Sie ihn nicht. Wenn Sie einen besseren Weg kennen, um dasselbe zu erreichen, lassen Sie es mich bitte wissen.
Zusammenfassen
Dies ist ein Hack , und die falsche Verwendung ist gefährlich. Verwenden Sie ihn nur zum Anwenden von Stilen, nachdem das ng-repeatRendern abgeschlossen ist und Sie keine Probleme haben sollten.
element.ready()Snippets? Ich meine ... ist es eine Art jQuery-Plugin, das Sie haben, oder sollte es ausgelöst werden, wenn das Element bereit ist?