2016-04-29 10 views
9

Ist es irgendwie möglich, zu überprüfen, ob der Winkelbereich isoliert ist oder nicht, nur mit dem Oszilloskop?Wie überprüft man, ob der Bereich isoliert ist?

Ich weiß, dass isolierte und nicht isolierte Bereiche unterschiedliche Prototypen haben. Diese Prototypen sind jedoch in eckiger Form und nicht leicht zugänglich. Die Überprüfung des Prototypnamens scheint ziemlich dreckig zu sein.

Eine bessere Idee?

+0

Wie wäre es mit der Überprüfung, ob es ein $ Elternteil gibt? – thegio

+0

Isolierte Bereiche haben auch Eltern. Nur der root-Bereich funktioniert nicht. –

+0

Ich werde deine Frage mit einer anderen Frage beantworten ... warum? haha – r0m4n

Antwort

2

Der erste Unterschied, den ich kenne, ist, dass isolierte Bereich hat "$ root" -Feld, das ist rootScope.

Der zweite Unterschied ist, dass Isoliert Umfang "$$ isolateBindings" Feld hat, aber nicht isoliert hat nicht

+1

Seien Sie vorsichtig mit etwas mit dem Präfix '$$'. Diese sind für AngularJS privat und können jederzeit entfernt werden. –

+0

Ja, Sie haben Recht, aber dieses Feld existiert schon lange nicht mehr. –

+0

Das stimmt, aber Sie müssen daran denken, es mit 'hasOwnProperty' zu überprüfen. Wenn Sie dies nicht tun, erhalten Sie ein falsches Ergebnis, da der Bereich prototypisch von einem Isolationsbereich auf einer bestimmten Ebene abgeleitet wird. –

1

Per Dokumentation, gehen Sie wie folgt sollte den Trick:

$element.isolateScope() 

ruft einen Isolate-Bereich ab, wenn einer direkt an das aktuelle Element angehängt ist. Dieser Getter sollte nur für Elemente verwendet werden, die eine -Direktive enthalten, die einen neuen Isolate-Bereich startet. Das Aufrufen von scope() für dieses Element gibt immer den ursprünglichen nicht isolieren Bereich zurück. Erfordert Debug Daten, die aktiviert werden sollen.

https://docs.angularjs.org/api/ng/function/angular.element#jquery-jqlite-extras

Wie in der Dokumentation erwähnt, wenn Sie die folgenden (wie Sie sollten in der Produktion) zu konfigurieren:

$compileProvider.debugInfoEnabled(false); 

Diese Methode wird nicht mehr funktionieren ... Ich nehme an die primäre Grund dafür, die isolateScope auf diese Weise zu erhalten, ist für Komponententests und es gibt nicht wirklich einen Grund, einige Maßnahmen zur Isolation des Oszilloskops bedingt durchzuführen (korrigiere mich, wenn ich falsch liege).

https://jsfiddle.net/r0m4n/f84yzdt4/

0

Sie können es wie folgt überprüfen:

if (scope.hasOwnProperty('$root') && scope.$root !== scope && scope.$root) { 
    // the scope is isolate 
} 

Es ist nicht perfekt ist, wie es auf Details der Implementierung beruht, aber ich kann nichts Besseres als dieses nicht denken.

Erläuterung:

  1. scope.hasOwnProperty('$root'). Jeder Bereich hat diese Eigenschaft. Es zeigt auf den nächsten Vorfahrenbereich, der Isolat oder $rootScope ist. Diese Eigenschaft wird prototypisch vererbt, also ist es eigene nur für isolieren Bereiche und $rootScope.

  2. scope.$root !== scope. Überprüfen, ob der Bereich nicht $rootScope ist.

  3. scope.$root. Kann durch !scope.$$destroyed ersetzt werden. Wenn ein Bereich zerstört wird, wird null vielen seiner Eigenschaften einschließlich $root zugewiesen, so dass die Eigenschaft eigene wird.

Verwandte Themen