3

Ich verwende eine Drittanbieter-Richtlinie in meiner eckigen App. Ich muss die Funktionalität mit meiner eigenen Anweisung erweitern und stieß auf einige Probleme mit der Reihenfolge, in der die Direktiven instanziiert sind.Abhängigkeiten von Direktiven

Die Richtlinien sollen wie folgt verwendet werden:

<third-party-dir ng-repeat="item in items" my-additional-dir> 
    <some-content /> 
</third-party-dir> 

Jedes Mal, wenn ein Element hinzugefügt i auf third-party-dir je einen Code ausgeführt werden soll. Jedoch wird zuerst my-additional-dir installiert und somit wurde die third-party-dir - link Funktion noch nicht ausgeführt. Ich habe versucht, Abhängigkeiten mit "require" hinzuzufügen, aber da thirdPartyDir keinen Controller verwendet (nur die Link-Funktion), wirft Winkel einen Fehler.

.directive('myAdditionalDir', function(){ 
    return { 
     require: '^thirdPartyDir' 
     restrict: 'A' 
     link: function(scope, element, attrs){ 
     if (scope.$last){ 
      //some code    
     }  

     } 
    } 
}) 

Error: [$compile: ctreq] Controller 'thirdPartyDir', required by directive 'myAdditionalDir', can't be found! 

schaute ich in Pre- und Post-Link-Funktionen, aber die Standard-Link-Funktion ist bereits eine Post-Link-Funktion. Irgendwelche Hinweise darauf, wie ich "warten" kann, dass die third-party-dir vor Ausführung des Codes innerhalb meiner Direktive installiert wird?

+0

Wenn Sie eine Direktive benötigen, wird der Controller dieser Direktive als 4. Argument in die Link-Funktion der Sub-Direktive eingefügt. Ich denke, der Fehler, dem Sie gegenüberstehen, ist, weil eckig nach dem Controller der übergeordneten Richtlinie sucht und ihn nicht finden kann. –

+0

Option 'require' funktioniert nur für Anweisungen mit * controller *. Wenn 'Third-Party-dir 'keinen * Controller * hat, können Sie' require:'^thirdPartyDir'' nicht verwenden. –

Antwort

3

Wenn Sie Ihre Anweisung deklarieren, können Sie priority verwenden, um die Reihenfolge zu bestimmen, in der die Verknüpfungsfunktionen aufgerufen werden.

https://docs.angularjs.org/api/ng/service/$compile#-priority-

Die Post-Links, um vom niedrigsten zum höchsten genannt. Sie können sich den Quellcode des Drittanbieters ansehen, um die Reihenfolge zu ermitteln und Ihren niedrigeren Wert festzulegen.

.directive('myAdditionalDir', function(){ 
    return { 
     priority: -1 
+0

sieht beim ersten Laden der Seite gut aus, aber aus irgendeinem Grund ist die Reihenfolge anders, wenn ein neuer DOM-Knoten durch ng-repeat hinzugefügt wird?! –

+0

nvm, überprüfen Sie Ihren Link für Folgendes: "Pre-Link-Funktionen werden auch in der Reihenfolge der Priorität ausgeführt, aber Post-Link-Funktionen werden in umgekehrter Reihenfolge ausgeführt." Die Verwendung eines positiven Werts für die Priorität funktioniert einwandfrei. –

+0

Ja, tut mir leid, ich kann nicht den ganzen Code sehen, also benutze einfach den Wert, der für dich funktioniert. –

Verwandte Themen