Das Problem hier ist das Folgende; Wir möchten vermeiden, dass jedem Kind ein Ereignis-Listener hinzugefügt wird, sondern nur dem übergeordneten Element. Der Elternteil ist dafür verantwortlich, die entsprechenden Maßnahmen zu ergreifen. Die allgemeine Lösung hierfür ist die Verwendung einer gleichmäßigen Propagierung (Delegierung). Wir fügen nur einen Listener an das übergeordnete Element an, wenn ein Ereignis auf dem untergeordneten Element auftritt (in diesem Beispiel auf das Eingabeelement konzentrieren), wird es zum übergeordneten Element und das übergeordnete Element führt den Listener aus.
Hier ist die Richtlinie:
app.directive('ngFocusModel', function() {
return function (scope, element) {
var focusListener = function() {
scope.hasFocus = true;
scope.$digest();
};
var blurListener = function() {
scope.hasFocus = false;
scope.$digest();
};
element[0].addEventListener('focus', focusListener, true);
element[0].addEventListener('blur', blurListener, true);
};
});
Die Richtlinie für Veranstaltungen zuhört und setzt dementsprechend den Wert auf Umfang, so können wir bedingte Änderungen vornehmen.
Hier sind einige Dinge zu beachten.
focus
und blur
Ereignisse nicht "Blase", müssen wir "Ereigniserfassung" verwenden, um sie zu fangen. Deshalb wird element.on('focus/blur')
nicht verwendet (es erlaubt nicht Capture, afaik), sondern eine addEventListener
Methode. Mit dieser Methode können Sie angeben, ob der Listener bei "Event-Bubbling" oder "Event-Capturing" ausgeführt werden soll, indem Sie das dritte Argument entsprechend auf false
oder true
setzen. die „Blase“ verwendet, leider sind diese nicht in Firefox unterstützt (focusin und focusout)
Wir focusin
und focusout
Ereignisse haben könnte.
Hier ist ein plunker mit der Implementierung.
Update: Es fiel mir ein, dass dies mit reinem CSS mit der :focus
Pseudo-Klasse durchgeführt werden kann, ist der einzige Nachteil, dass der Platzhalter in der richtigen Position sein muss (Geschwister) in Bezug auf die Eingabeelemente. Siehe codepen.
haben Sie eine Code? z.B. Jfiddle, Jsbin. Ich denke ich verstehe deinen Standpunkt, aber ... –
Wir sind nicht klar, was genau du willst, könntest du bitte Geige/Plunkr hinzufügen? –
@pankajparkar Vielleicht bin ich auch nicht. Also versuchte ich [ein Plunk] (http://plnkr.co/edit/EV9hwaf0W18BbZX1zQkJ?p=preview). Der auskommentierte wie ist der wichtige. – maaartinus