jsプロジェクトでの双方向データバインディングの簡単な実装方法

jsプロジェクトでの双方向データバインディングの簡単な実装方法

序文

双方向データ バインディングとは、オブジェクトのプロパティが変更されると、対応する UI も同時に変更できること、およびその逆であることを意味します。つまり、name プロパティを持つユーザー オブジェクトがある場合、user.name に新しい値を設定するたびに、UI にも新しい値が表示されます。同様に、UI にデータ ユーザーの名前の入力ボックスが含まれている場合、新しい値を入力すると、ユーザー オブジェクトの名前プロパティがそれに応じて更新されます。

Ember.js、Angular.js、KnockoutJS などの多くの一般的な JavaScript フレームワークは、双方向データ バインディングを主要な機能の 1 つとして推進しています。これは、ゼロから実装するのが難しいという意味ではなく、この種の機能が必要な場合にこれらのフレームワークを使用するのが唯一の選択肢であるという意味でもありません。基本的な考え方は実は非常に基本的なものであり、それを実装するには次の 3 つのポイントに要約できます。

  • どの UI 要素がどのプロパティにバインドされているかを判断する方法が必要です。
  • プロパティとUIの変更を監視する必要がある
  • バインドされたすべてのオブジェクトと UI 要素に変更を伝播する必要があります。

パブリッシュ・サブスクライバ・パターン

パブリッシュ/サブスクライブ モデルは、実際にはオブジェクト間の 1 対多の依存関係です。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに状態の変化が通知されます。

サブスクライバーは、サブスクライブしたいイベントをディスパッチセンター(イベントチャネル)に登録(Subscribe)します。パブリッシャー(Publisher)がディスパッチセンターにイベントを発行(Publish Event)すると、つまりイベントがトリガーされると、ディスパッチセンターはサブスクライバーが登録した処理コードをディスパッチセンターに一律にディスパッチ(Fire Event)します。

結果

電話

HTML 呼び出し終了バインディング data-bind-phone="name"

  <ul>

       <li class="block-phone fix bd-bottom">

            <label for="J_verificationPhone" data-bind-phone="tishi"><span>電話番号</span></label>

            <input class="fix1" id="J_verificationPhone" data-bind-phone="name" name="phone" type="text" />

            <button class="right J_clickTime" type="button">

            <span class="award-messages-btn2 J_messagesBtn1">認証コードを取得</span>

            <span class="award-messages-btn2 J_messagesBtn2 none"><i>60 秒後に再送信</i></span>

          </ボタン>

     </li>

       <li class="ブロック検証修正">

            <label for="J_verificationCode"><span>検証コード</span></label>

            <input class="fix1" data-bind-code="tishi" id="J_verificationCode" data-bind-phone="name" name="verification-code" class="" type="" />

       </li>

   </ul>

js呼び出し次のコードコメントを参照してください

/**
 * 関数検証コールバックコールバックメソッド* [$btn1 説明]
 * データバインド電話="名前"
 * @message {[type]} 変更されたフィールド電話番号
 * @prop_name {[type]} フィールドの値名
 * @target {[type]} ターゲット jsdom オブジェクト。
 * @targetValue {[type]} ターゲットjsdomオブジェクトの値
 */// コールバック関数をリッスンすると、関数は targetvalue、ターゲット js dom オブジェクトの値を取得し、変更されたフィールドを操作するのに便利です。 ! !
var User = require('../../entry/module/twoWayAudio.js');
var phone = 新しいユーザー('phone',verificationCallback);
 関数検証コールバック(メッセージ、プロパティ名、ターゲット、ターゲット値){
}

インポートされたソースコード twoWayAudio

関数 DataBinder(object_id,verificationCallback){
  // 単純な pubSub オブジェクトを作成する var pubSub = {
コールバック: {},
on: 関数(メッセージ、コールバック) {
this.callbacks[msg] = this.callbacks[msg] || [];
this.callbacks[msg].push(コールバック);
},
公開: 関数(メッセージ) {
\

this.callbacks[msg] = this.callbacks[msg] || [];
(var i = 0, len = this.callbacks[msg].length; i < len; i++) {
this.callbacks[msg][i].apply(this,arguments);
};
}
},

data_attr = "data-bind-" + object_id、
メッセージ = object_id + ":change",
changeHandler = 関数(イベント) {
var target = event.target || event.srcElement, // IE8 互換 prop_name = target.getAttribute(data_attr);
if (prop_name && prop_name !== "") {
if (検証コールバック) {
var targetValue = target.value;
検証コールバック (メッセージ、prop_name、ターゲット、ターゲット値);
}
pubSub.publish(メッセージ、prop_name、target.value);
}
};

// イベントの変更をリッスンし、pubSub にプロキシします
ドキュメントにイベントリスナーを追加する場合
document.addEventListener("keyup",changeHandler,false);
} それ以外{
// IE8 は addEventListener の代わりに attachmentEvent を使用します
document.attachEvent("onkeyup",changeHandler);
};

// pubSub はバインドされたすべての要素に変更を伝播します pubSub.on(message,function(event,prop_name,new_val){
var elements = document.querySelectorAll("[" + data_attr + "=" +prop_name + "]"),
タグ名;
(var i = 0, len = elements.length; i < len; i++) {
タグ名 = elements[i].tagName.toLowerCase();
if (tag_name === "input" || tag_name === "textarea" || tag_name === "select") {
要素[i].値 = new_val;

} それ以外{
要素[i].innerHTML = new_val;
};
};
})
pubSub を返します。
}

関数 User(uid,verificationCallback) {
  var バインダー = 新しい DataBinder(uid,verificationCallback)、
  ユーザー = {
  属性 : {}、
  // 属性セッターはデータバインダーpubSubを使用してセットを公開します: function (attr_name, val) {
  this.attribute[attr_name] = val;
  バインダーを公開します(uid + ":change",attr_name,val,this);
  },
  取得:関数(属性名){
  this.attribute[attr_name]を返します。
  },
  _binder : バインダー
  };

バインダー.on(uid + ":change",関数(イベント,attr_name,new_val,イニシエーター) {
if (イニシエーター !== ユーザー) {
user.set(attr_name,new_val);
}
});
ユーザーを返します。
}
module.exports = ユーザー;
// phone.set( "name", "lwl" );
  // phone.set( "tishi", "ヒント" );

代替ソリューション

上記は双方向データバインディングの単なるカバーです。実際、この要件はもっと簡単に実装できます。

 $('.block-phone #phone')[0].oninput=function(){
 コンソールログ($(これ))
}

要約する

これで、js プロジェクトでの双方向データバインディングの簡単な実装方法についての記事は終了です。より関連性の高い js 双方向データバインディング実装コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue.js データ バインディング メソッド (一方向、双方向、および 1 回限りのバインディング)
  • 非常にシンプルな js 双方向データバインディングを実装する
  • JavaScript で双方向データバインディングを実装する 3 つの方法の概要
  • JavaScriptデータの双方向バインディングを簡単に実装
  • JavaScript における双方向データバインディングの詳細な説明
  • JSネイティブデータ双方向バインディング実装コード
  • JSデータの双方向バインディングの原則と使用例の分析
  • jsでビューとデータの双方向バインディングを実現する方法の分析

<<:  MySQL Strict Modeの知識ポイントの詳細な説明

>>:  史上最も便利な Zookeeper サーバーの構築方法 (推奨)

推薦する

ESXI の仮想マシンにワークステーションをインストールするときに発生するネットワーク障害の解決策

問題の説明ESXI で Windows にワークステーションをインストールした後、内部の仮想マシンは...

Dockerコンテナのログ処理の詳細な説明

Docker には多くのログ プラグインがあります。デフォルトでは json-file を使用します...

MySQL トランザクション分離レベルと MVCC の詳細な説明

目次トランザクション分離レベル同時トランザクション実行中に発生した問題SQL標準の4つの分離レベルM...

要素のel-tree複数選択ツリー(チェックボックス)親子ノードの関連付けが関連付けられていません

属性チェック-厳密公式ドキュメントでは、チェックボックスが表示されるときに親項目と子項目を互いに関連...

tdが空の場合に境界線を表示する方法

以前、CSS を使用してテーブルの border + bordercolordark + borde...

JS における for、for...in、for...of、forEach の違いと使用例

forループ基本的な構文形式: for(変数の初期化; 条件式; 演算式){ループ本体ステートメント...

MySQL データベース接続例外の概要 (収集する価値あり)

Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...

Vue Elementのテーブルコンポーネントをカプセル化する方法

Vue コンポーネントをカプセル化する場合でも、機能コンポーネントをクロスファンクショナルに使用しま...

実用的なクイックスタートReactルーティング開発

インストールインストールするには、次のコマンドを入力します。 // ネプ npm で react-r...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...

Linuxパフォーマンス監視コマンドの簡単な紹介

システムでさまざまな IO ボトルネック、メモリ使用量の増加、CPU 使用率の増加などの問題が発生し...

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...

デジタル時計効果を実現するJavaScript

この記事の例では、JavaScriptでデジタル時計効果を実装するための具体的なコードを参考までに共...