ng-Wiederholungsreihenfolge wird durch ng-if umgekehrt

8

Ich bin gerade auf dieses Problem gestoßen und frage mich, ob es sich um einen Fehler oder ein erwartetes Verhalten handelt. Dies ist nur ein kleines Beispiel, um das Problem zu zeigen. Der folgende Code wird in beiden Beispielen verwendet:

%Vor%


%Vor%

Das erste Beispiel hat diese item-directive.html, die in der richtigen Reihenfolge wie erwartet gerendert wird

%Vor%

Plunkr ohne ng-if

Aber das zweite Beispiel - mit der folgenden item-directive.html - enthält ein ng-if , was dazu führt, dass die Liste in umgekehrter Reihenfolge gerendert wird?

%Vor%

Plunkr mit ng-if


-------- UPDATE ----------

Ich habe gerade bemerkt (was sich auf das in @ squiroid's Antwort erwähnte Problem bezieht), dass der isolierende Bereich in diesem Beispiel nicht wirklich funktioniert. Es scheint so zu sein, aber item wird dem item-directive Bereich (oder vielmehr dem Bereich, in dem es endet) vom ng-repeat zur Verfügung gestellt, nicht vom isolieren Bereich. Wenn Sie versuchen, andere Werte auf dem isolate-Bereich festzulegen, obwohl sie in dem Bereich angezeigt werden, der an die Link- und Controller-Funktionen der Direktive übergeben wird (wie in der Konsolenausgabe für den PLNKR zu sehen ist), sind sie nicht verfügbar Vorlage. Es sei denn, Sie entfernen replace .

Plunkr zeigt den Bereich für defekte Isolate

Plunkr zeigt einen fixierten Isolat-Bereich, wenn replace: false

ist


--- UPDATE 2 ---

Ich habe beide Beispiele aktualisiert, um zu zeigen, dass das Problem weiterhin auftritt, sobald der isolate-Bereich entfernt wurde

Plunkr ohne ng-if und isolate-Bereich

Plunkr mit ng-if und isolate-Geltungsbereich

Und auch eine neue Version, die den Wechsel von templateUrl zu Template zeigt - wie von @Manube vorgeschlagen - zeigt das Verhalten, das wie erwartet funktioniert

Plunkr mit ng-if und no isolate scope mit Vorlage anstelle von templateUrl

    
james 21.02.2015, 17:24
quelle

3 Antworten

1

Verwenden von ng-if für ein root-Element einer Direktive mit replace: true erzeugt einen defekten Bereich

AUSGABE

Dies geschieht mit der Kombination von replace: 'true' und ng-if auf dem root-Element.

Stellen Sie sicher, dass der Inhalt Ihres html in der templateUrl genau ein Wurzelelement hat.

Wenn Sie ng-if auf span setzen

%Vor%

Nun, warum es passiert, geschieht dies, weil die ngIf-Direktive einen Teil des DOM-Baums basierend auf einem {Ausdruck} entfernt oder neu erstellt. Wenn der zu ngIf zugewiesene Ausdruck einen falschen Wert ergibt, wird das Element aus dem DOM entfernt, andernfalls wird ein Klon des Elements in das DOM eingefügt.

was beim Rendern zu keinem Root-Element auf der templateUrl führen kann und somit zu unerwünschtem Verhalten führt.

    
squiroid 21.02.2015 18:17
quelle
1

Es geht um templateUrl, das asynchron ist;

Wenn Sie templateUrl durch

ersetzen %Vor%

Es wird wie erwartet funktionieren: siehe bottom mit Vorlage anstelle von templateUrl

Der Test <div ng-if="item.type === 'test'"> wird ausgeführt, wenn der Bereich bereit ist und die VorlageUrl abgerufen wurde.

Da das Holen der Vorlage asynchron ist, führt die jeweils zuerst zurückgegebene Vorlage den Test aus und zeigt das Element an.

Jetzt ist die Frage: Warum ist es immer die letzte Vorlage, die zuerst zurückkommt?

    
Manube 21.02.2015 18:07
quelle
0

Der zweite wird in umgekehrter Reihenfolge angezeigt, da die benutzerdefinierte Direktive mit dem Namen der Element-Direktive definiert wurde, aber aufgrund von replace = true nicht in DOM gerendert wird.

Weitere Informationen finden Sie in diesem Link

    
TechnoCrat 21.02.2015 18:30
quelle

Tags und Links