2017-05-12 5 views
0

Ich habe 3 Elementen/Tive Innenseite ineinander verschachtelt:ngIf Umfang definierenden Wert auf sich selbst

dirElement(scope A) 
    ngIfElement(scope B) 
     isolateDirectiveElement(scope C) 

Scope Eine Variable test hat. Scope C bindet bidirektional über ein Attribut, aber irgendwann funktioniert diese Bindung nicht mehr - wenn der Scope-A-Wert aktualisiert wird, selbst innerhalb eines $ apply-Blocks oder mit $ apply manuell aufgerufen, wird Scope Cs Wert nicht aktualisiert. Bei der Inspektion der 3 Zielfernrohre habe ich festgestellt, dass in einem Bereich B auch test definiert ist. Da, glaube ich, die folgenden Punkte zutrifft:

  1. Mit jedem Zyklus $ anwenden, um die Zwei-Wege-Bindung Versuche, den Stammwert von Schreiben sie direkt auf den übergeordneten Bereich unter test zu aktualisieren.

  2. Mit jedem $ Apply-Zyklus versucht die bidirektionale Bindung, das untergeordnete Element zu aktualisieren, indem es test aus dem übergeordneten Bereich gelesen wird. Dies kann immer nur den Wert lesen, den es gerade gesetzt hat, und da nichts anderes diesen Wert auf Bereich B setzt, bleibt Bereich C mit dem aktuellen Wert für test hängen.

Wesentlichen aus dem gleichen Grund müssen Sie ein . in ngModel zu diesem Szenario ist die Anwendung. Das scheint glaubwürdig genug zu sein (ich würde immer noch argumentieren, dass das Verhalten von (1) unnötig gefährlich ist), aber irgendwie hat diese Situation nie Fehler für mich verursacht (wo ein intermediärer Bereich existiert zwischen einem isolieren Bereich und dem Bereich, von dem er Werte zieht) und ich bin ziemlich sicher, dass ich Bereiche auf die gleiche Weise zuvor ohne Fehler kombiniert habe. Eine milde Eindeutigkeit dieser Situation ist, dass Bereich A auch ein isolierter Bereich ist, aber vorausgesetzt, dass alles ein untergeordneter Geltungsbereich davon/Teil seiner Vorlage ist, der nicht wichtig sein sollte.

Bin ich richtig, dass der beste Weg, um dies zu beheben ist test zu test.value (und definieren Test als {} in Rahmen A der Steuerung) zu ändern?

Antwort

0

Wahrscheinlich nicht das, was Sie hören möchten, aber die beste Lösung ist die Umstellung auf den Controller als Arbeitsweise und die Verwendung von $ scope vollständig einzustellen. Sie können darüber in der style-guide lesen. Das Problem, das Sie haben, wird nicht durch die Variable .test in der ngIf-Direktive verursacht, sondern durch die Art und Weise, wie die Transclusion funktioniert. In Kombination mit der Isolation, die Sie verwenden, wird es unvorhersehbar. Eine leichte Eindeutigkeit dieser Situation ist, dass Scope A auch ein isolierter Scope ist, aber vorausgesetzt, dass alles ein Kindbereich von ihm/Teil seiner Vorlage ist, sollte das keine Rolle spielen.

O ja, das ist wichtig! Ich erinnere mich nicht an die Version, aber dieser "Leck" -Bug ist behoben und wird in den späteren AngualrJS-Versionen nicht mehr funktionieren. (und das ist nicht einmal das ganze Problem)

Sie würden sich wirklich einen Gefallen tun, wenn Sie auf die (nicht so) neue Art der Arbeit mit Komponenten und ControllerAs wechseln. Benannte Controller werden dieses Problem beheben. Konvertieren Sie Ihre Anweisungen in Komponenten und die Verwendung eines Controllers anstelle einer Link-Funktion ist eigentlich nicht so schwierig, und es erspart Ihnen alle Arten von Überraschungen wie diese.

Oh, und wahrscheinlich die Einführung des Punktes, wird helfen, aber angesichts Ihrer Einrichtung mit isolierten $ Scopes, kombiniert mit der Transkription, würde ich nicht davon überzeugt werden, es ist eine 100% Heilung in allen Fällen.