2015-04-08 8 views
7

Ich schreibe eine Direktive, die einen Bereich des aktuellen DOM-Elements abrufen muss. Verwenden der nicht öffentlichen api angular.element().scope();Gibt es eine Möglichkeit, einen Bereich eines DOM-Elements zu erhalten, wenn Debug-Informationen deaktiviert sind?

Es funktioniert gut, bis eckige 1.3 eine neue Funktion $compileProvider.debugInfoEnabled(false); eingeführt, die hauptsächlich zur Verbesserung der Leistung zu vermeiden Daten in DOM-Element zu binden zielt. Wenn jedoch debugInfoEnabled() auf false gesetzt ist, gibt angular.element().scope()undefined zurück. Also muss ich einen anderen Weg finden, um den Umfang eines DOM-Elements zu erhalten, oder ich muss meine Code-Logik neu gestalten.

Gibt es eine Möglichkeit, dies zu ermöglichen?

Antwort

9

Ich hatte gerade ein ähnliches Problem in unserer Anwendung nach der Erstellung unserer App mit $compileProvider.debugInfoEnabled(false); konfrontiert. Ich musste später auf einige der isolierenden Bereiche unserer Direktive zugreifen, konnte aber die Methode isolateScope() nicht verwenden. Um das Problem zu bekommen, habe ich eine Hilfsfunktion in einem Utils Dienst, der wie folgt aussieht:

this.setElementIsolateScope = function(element, scope) { 
    element[0].isolateScope = function() { 
     return scope; 
    }; 
}; 

dann in jeder Richtlinie, wo ich brauchte später in die Lage sein, um den Isolat Umfang greift mich auf diese Funktion innerhalb der link() genannt Funktion: Da element ein jqLite-Objekt ist, müssen Sie die isolateScope()-Funktion auf element[0] setzen. Sie sollten bereits die jqLite eingewickelten element und scope bereits in Ihre Link-Funktion übergeben haben, die Sie dann einfach an Ihre Service-Methode übergeben.

Utils.setElementIsolateScope(element, scope); 

dann, um später den Isolat Umfang zuzugreifen, würden Sie einen Verweis auf Ihr Element und dann das tun (child_element unter der Annahme, der Verweis auf Ihr Elemente/Richtlinie):

var child_iso_scope = _.isFunction(child_element.isolateScope) && child_element.isolateScope(); 

Je nachdem, wie Sie werden den Verweis auf Ihrem Element bekommen, müssen Sie es einen jqLite Wrapper wie diese wickeln:

child_element = angular.element(child_element); 

Und dann wie oben die gleiche Art und Weise verwenden, das Isolat zu erhalten Umfang. Hoffe das hilft!

Verwandte Themen