VorwortZweiseitige Datenbindung bedeutet, dass bei einer Änderung der Eigenschaften eines Objekts gleichzeitig die entsprechende Benutzeroberfläche geändert werden kann und umgekehrt. Mit anderen Worten: Wenn wir ein Benutzerobjekt mit einer Namenseigenschaft haben, zeigt die Benutzeroberfläche immer dann, wenn Sie einen neuen Wert für user.name festlegen, auch den neuen Wert an. Wenn die Benutzeroberfläche ein Eingabefeld für den Namen eines Datenbenutzers enthält, führt die Eingabe eines neuen Werts dazu, dass die Namenseigenschaft des Benutzerobjekts entsprechend aktualisiert wird. Viele beliebte JavaScript-Frameworks wie Ember.js, Angular.js oder KnockoutJS fördern die bidirektionale Datenbindung als eines ihrer Hauptfeatures. Dies bedeutet weder, dass die Implementierung von Grund auf schwierig ist, noch dass die Verwendung dieser Frameworks unsere einzige Option ist, wenn wir diese Art von Funktionalität benötigen. Die zugrundeliegende Idee ist eigentlich recht einfach und ihre Umsetzung kann auf die folgenden drei Punkte reduziert werden:
Publish-Subscriber-MusterDas Publish-Subscribe-Modell stellt eigentlich eine Eins-zu-viele-Abhängigkeitsbeziehung zwischen Objekten dar. Wenn sich der Status eines Objekts ändert, werden alle davon abhängigen Objekte über die Statusänderung benachrichtigt. Der Abonnent registriert (Abonnieren) das Ereignis, das er abonnieren möchte, beim Dispatch-Center (Ereigniskanal). Wenn der Herausgeber (Publisher) das Ereignis (Publish Event) beim Dispatch-Center veröffentlicht, d. h. wenn das Ereignis ausgelöst wird, versendet das Dispatch-Center den vom Abonnenten registrierten Verarbeitungscode einheitlich an das Dispatch-Center (Fire Event). Ergebnis AnrufHTML-Anrufende-Bindung data-bind-phone="name" <ul> <li Klasse="Block-Telefon reparieren bd-bottom"> <label for="J_verificationPhone" data-bind-phone="tishi"><span>Telefonnummer</span></label> <input class="fix1" id="J_verificationPhone" data-bind-phone="name" name="telefon" type="text" /> <button Klasse="rechts J_clickTime" Typ="button"> <span class="award-messages-btn2 J_messagesBtn1">Bestätigungscode erhalten</span> <span class="award-messages-btn2 J_messagesBtn2 none"><i>Nach 60</i> Sekunden erneut senden</span> </button> </li> <li class="Blocküberprüfungs-Fix"> <label for="J_verificationCode"><span>Verifizierungscode</span></label> <input class="fix1" data-bind-code="tishi" id="J_verificationCode" data-bind-phone="name" name="verification-code" class="" type="" /> </li> </ul> js-Aufruf siehe folgende Codekommentare /** * Funktion verificationCallback Rückrufmethode * [$btn1 Beschreibung] * data-bind-phone="Name" * @message {[type]} Das geänderte Feldtelefon * @prop_name {[type]} Wertname des Feldes * @target {[Typ]} Ziel-JSdom-Objekt; * @targetValue {[type]} Wert des Ziel-jsdom-Objekts */// Hören Sie auf die Rückruffunktion, die Funktion erhält den Wert des Zielwerts, das Ziel-JS-DOM-Objekt, was für die Bedienung der geänderten Felder praktisch ist! ! ! var Benutzer = erforderlich('../../entry/module/twoWayAudio.js'); var Telefon = neuer Benutzer ('Telefon', Überprüfungs-Rückruf); Funktion verificationCallback(Nachricht,Eigenschaftsname,Ziel,Zielwert){ } Importierter Quellcode twoWayAudio Funktion DataBinder(Objekt-ID, Verifizierungs-Callback){ // Erstelle ein einfaches pubSub Objekt var pubSub = { Rückrufe: {}, ein: Funktion(Nachricht,Rückruf) { dies.callbacks[msg] = dies.callbacks[msg] || []; dies.callbacks[msg].push(callback); }, veröffentlichen: function(msg) { \ dies.callbacks[msg] = dies.callbacks[msg] || []; für (var i = 0, len = this.callbacks[msg].length; i < len; i++) { dies.callbacks[msg][i].apply(dies,Argumente); }; } }, data_attr = "Datenbindungs-" + Objekt-ID, Nachricht = Objekt-ID + ":Ändern", changeHandler = Funktion(Ereignis) { var target = event.target || event.srcElement, // IE8-kompatibel prop_name = target.getAttribute(data_attr); wenn (Eigenschaftsname && Eigenschaftenname !== "") { if (Verifizierungs-Rückruf) { var Zielwert = Ziel.Wert; verificationCallback (Nachricht, Eigenschaftenname, Ziel, Zielwert); } pubSub.publish(Nachricht, Eigenschaftsname, Zielwert); } }; // Auf Ereignisänderungen warten und an PubSub weiterleiten wenn (Dokument.addEventListener) { document.addEventListener("keyup",changeHandler,false); } anders{ // IE8 verwendet attachEvent statt addEventListener Dokument.attachEvent("onkeyup",changeHandler); }; // pubSub propagiert Änderungen an alle gebundenen Elemente pubSub.on(message,function(event,prop_name,new_val){ var Elemente = document.querySelectorAll("[" + data_attr + "=" +prop_name + "]"), Tagname; für (var i = 0, len = Elemente.Länge; i < len; i++) { tag_name = Elemente[i].tagName.toLowerCase(); wenn (tag_name === "Eingabe" || tag_name === "Textbereich" || tag_name === "Auswählen") { Elemente[i].Wert = neuer_Wert; } anders{ Elemente[i].innerHTML = neuer_Wert; }; }; }) gib pubSub zurück; } Funktion Benutzer(uid,verificationCallback) { var binder = neuer DataBinder(uid,verificationCallback), Benutzer = { Attribut: {}, // Der Attribut-Setter verwendet den Datenbinder pubSub zum Veröffentlichen von set : function (attr_name, val) { dieses.Attribut[attr_name] = Wert; binder.publish(uid + ":ändern",attr_name,val,this); }, get : Funktion (Attr_Name) { gib dieses Attribut zurück[attr_name]; }, _binder : binder }; binder.on(uid + ":change",Funktion(Ereignis,Attr_Name,neuer_Wert,Initiator) { if (initiator !== benutzer) { Benutzer.set(attr_name,neuer_Wert); } }); Benutzer zurückgeben; } module.exports = Benutzer; // Telefon.set( "Name", "lwl" ); // phone.set( "tishi", "Telefon" ); Alternative Lösungen Das Obige ist nur ein Deckmantel für die bidirektionale Datenbindung. Tatsächlich kann diese Anforderung einfacher umgesetzt werden. $('.block-phone #phone')[0].oninput=Funktion(){ konsole.log($(dies)) } ZusammenfassenDamit ist dieser Artikel über die einfache Implementierungsmethode der bidirektionalen Datenbindung in JS-Projekten abgeschlossen. Weitere relevante Inhalte zur Implementierung der bidirektionalen JS-Datenbindung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Detaillierte Erläuterung der Wissenspunkte zum MySQL Strict Mode
>>: Der bequemste Weg, einen Zookeeper-Server in der Geschichte zu erstellen (empfohlen)
Inhaltsverzeichnis Vorwort Globale Sperre Vollstä...
1. Grundlegende Verwendung <!DOCTYPE html> ...
Ich glaube, jeder Mensch ist sehr sensibel für Fa...
Inhaltsverzeichnis 1. Was ist eine Unterabfrage? ...
Überblick Ich verwende Docker seit über einem Jah...
MySQL ist eine sehr leistungsfähige relationale D...
1. CSS-Navigationsleiste (1) Funktion der Navigat...
#Docker-Suche #Docker-Pull-Portainer 1. Laden Sie...
Inhaltsverzeichnis Arithmetische Operatoren Abnor...
Inhaltsverzeichnis 1. Fehlermeldung 2. Fehlerursa...
Inhaltsverzeichnis Vorwort Berechnete Eigenschaft...
1. HTML-Bild <img> 1. Das <img>-Tag u...
Inhaltsverzeichnis 1. Index-Grundlagen 1. Arten v...
Typische Layoutbeispiele Wie im obigen Bild gezei...
Vorwort Dockerfile ist ein vom Docker-Programm in...