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

Node.js versendet E-Mails basierend auf dem STMP-Protokoll und dem EWS-Protokoll

Inhaltsverzeichnis 1 Node.js-Methode zum Senden v...

Verwendung des Linux-Befehls „cal“

1. Befehlseinführung Mit dem Befehl cal (Kalender...

Eine kurze Diskussion zu this.$store.state.xx.xx in Vue

Inhaltsverzeichnis Sehen Sie sich dies an.$store....

Detaillierte Erklärung der berechneten Eigenschaften in Vue

Inhaltsverzeichnis Interpolationsausdrücke Method...

Vue implementiert eine gleitende Navigation oben links und rechts

Navigation und andere Dinge werden bei der täglic...

MySQL 8.0.20 Installations-Tutorial mit Bildern und Text (Windows 64-Bit)

1: Download von der offiziellen MySQL-Website htt...

Rastersysteme im Webdesign

Bildung des Gittersystems Im Jahr 1692 war der fr...

Lösung für das Problem ungenauer JS-Zahlen

Die verständlichste Erklärung des Genauigkeitspro...

Vue-Router-Verlaufsmodus, serverseitiger Konfigurationsprozess-Datensatz

Geschichtsroute Der Verlaufsmodus bezieht sich au...

So installieren Sie nginx unter Linux

Nginx wurde in der Programmiersprache C entwickel...

Neunundvierzig JavaScript-Tipps und Tricks

Inhaltsverzeichnis 1. Betrieb von js Integer 2. S...