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)
Einige Projekte haben ein relativ einfaches Gesch...
Vom Kunsthandwerksdesign über Grafikdesign bis hin...
Als ich kürzlich eine mobile Seite entwickelte, s...
Aktivieren Sie Remote-Zugriffsrechte für MySQL My...
Sehen wir uns zunächst verschiedene Möglichkeiten...
Verwendung des ALTER-Befehls in MySQL zum Bearbei...
In einem aktuellen Projekt wollte ich Text vertik...
Beschreibung: Stellen Sie einen Timer ein, um den ...
Vorwort Dieser Artikel stellt hauptsächlich 4 Met...
Inhaltsverzeichnis 1. Gojs-Implementierung 1. Zei...
MySQL 5.7.9 Version sql_mode=only_full_group_by P...
Öffnen Sie das dekomprimierte Verzeichnis von Tom...
Dies ist das Installationstutorial von mysql5.7.1...
Zusammenfassung In einigen Szenarien kann eine so...
<br />Das sinnvolle Hinzufügen von Bildern k...