Einfache Implementierungsmethode der bidirektionalen Datenbindung im JS-Projekt

Einfache Implementierungsmethode der bidirektionalen Datenbindung im JS-Projekt

Vorwort

Zweiseitige 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:

  • Wir benötigen eine Möglichkeit, um zu bestimmen, welches UI-Element an welche Eigenschaft gebunden ist.
  • Wir müssen Änderungen an Eigenschaften und Benutzeroberfläche überwachen
  • Wir müssen Änderungen an allen gebundenen Objekten und UI-Elementen weitergeben.

Publish-Subscriber-Muster

Das 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

Anruf

HTML-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))
}

Zusammenfassen

Damit 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:
  • Vue.js-Datenbindungsmethoden (Einweg-, Zweiweg- und einmalige Bindung)
  • Implementieren Sie eine sehr einfache bidirektionale JS-Datenbindung
  • Zusammenfassung der drei Möglichkeiten zur Implementierung der bidirektionalen Datenbindung in Javascript
  • Einfache Implementierung der bidirektionalen Bindung von Javascript-Daten
  • Detaillierte Erklärung der bidirektionalen Datenbindung in JavaScript
  • Implementierungscode für die bidirektionale Bindung nativer JS-Daten
  • Zweiwegebindungsprinzip und Anwendungsbeispielanalyse von JS-Daten
  • Analyse der Methode zur Realisierung der bidirektionalen Bindung von Ansicht und Daten in js

<<:  Detaillierte Erläuterung der Wissenspunkte zum MySQL Strict Mode

>>:  Der bequemste Weg, einen Zookeeper-Server in der Geschichte zu erstellen (empfohlen)

Artikel empfehlen

js, um einen einfachen Front-End-Paging-Effekt zu erzielen

Einige Projekte haben ein relativ einfaches Gesch...

Einige wichtige Punkte des visuellen Website-Designs

Vom Kunsthandwerksdesign über Grafikdesign bis hin...

So implementieren Sie adaptive Container mit gleichem Seitenverhältnis mit CSS

Als ich kürzlich eine mobile Seite entwickelte, s...

Detaillierte Zusammenfassung der Übermittlungsmethoden für Webformulare

Sehen wir uns zunächst verschiedene Möglichkeiten...

So realisieren Sie die vertikale Anordnung von Text mit CSS3

In einem aktuellen Projekt wollte ich Text vertik...

Beispiele für 4 Methoden zum Einfügen großer Datenmengen in MySQL

Vorwort Dieser Artikel stellt hauptsächlich 4 Met...

Gojs implementiert Ameisenlinien-Animationseffekt

Inhaltsverzeichnis 1. Gojs-Implementierung 1. Zei...

Lösen Sie das MySQL 5.7.9 Version sql_mode=only_full_group_by Problem

MySQL 5.7.9 Version sql_mode=only_full_group_by P...

Eine detaillierte Einführung in die Tomcat-Verzeichnisstruktur

Öffnen Sie das dekomprimierte Verzeichnis von Tom...

So implementieren Sie „insert if none“ und „update if yes“ in MySql

Zusammenfassung In einigen Szenarien kann eine so...

XHTML-Tutorial für die ersten Schritte: XHTML-Webseiten-Bildanwendung

<br />Das sinnvolle Hinzufügen von Bildern k...