Die bisher gegebenen Antworten funktionieren nur beim ersten ng-repeat
Rendern . 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-repeat
Wird gerendert, funktionieren diese Lösungen nicht für Sie.
Also, wenn Sie JEDES MAL benachrichtigt werden müssen , dass die ng-repeat
bekommt 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 $filter
in 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 $emit
ein Ereignis, das ngRepeatFinished
jedes Mal aufgerufen wird, wenn das ng-repeat
gerendert wird.
Wie man es benutzt:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
Der ngRepeatFinish
Filter muss direkt auf einen Array
oder einen Object
in Ihrem definierten Filter angewendet werden. Anschließend $scope
kö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 ngRepeatFinish
Filter 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 ngRepeatFinished
Ereignis behandelt, NICHT tun sollten :
Führen Sie $scope.$apply
in 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 $scope
Eigenschaften vorzunehmen , da diese Änderungen erst in der nächsten $digest
Schleife in Ihrer Ansicht wiedergegeben werden und da Sie keine Änderungen vornehmen können, sind $scope.$apply
sie 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-repeat
Rendern 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?