欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js項目中雙向數(shù)據(jù)綁定的簡單實現(xiàn)方法

 更新時間:2021年08月29日 11:28:04   作者:hyman  
雙向數(shù)據(jù)綁定指的就是,綁定對象屬性的改變到用戶界面的變化的能力,反之亦然,下面這篇文章主要給大家介紹了關(guān)于js項目中雙向數(shù)據(jù)綁定的簡單實現(xiàn)方法,需要的朋友可以參考下

前言

雙向數(shù)據(jù)綁定 指的是當對象的屬性發(fā)生變化時能夠同時改變對應的UI,反之亦然。換句話說,如果我們有一個user對象,這個對象有一個name屬性,無論何時你對user.name設(shè)置了一個新值,UI也會展示這個新的值。同樣的,如果UI包含一個用于數(shù)據(jù)用戶名字的輸入框,輸入一個新值也會導致user對象的name屬性發(fā)生相應的改變。

許多流行的javascript框架,像Ember.js,Angular.js或者KnockoutJS都會把雙向數(shù)據(jù)綁定作為其中的主要特性來宣傳。這并不意味著從頭開始實現(xiàn)它很難,也不意味著當我們需要這種功能的時候,使用這些框架是我們唯一的選擇。內(nèi)部的潛在思想事實上是相當基礎(chǔ)的,實現(xiàn)它可以歸納為以下三點:

  • 我們需要一種方式確定哪個UI元素綁定在哪個屬性上。
  • 我們需要監(jiān)控屬性和UI的變化
  • 我們需要把所有綁定的對象和UI元素的變化傳播出去。

發(fā)布訂閱者模式

發(fā)布-訂閱模式其實是一種對象間一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)送改變時,所有依賴于它的對象都將得到狀態(tài)改變的通知。

訂閱者(Subscriber)把自己想訂閱的事件注冊(Subscribe)到調(diào)度中心(Event Channel),當發(fā)布者(Publisher)發(fā)布該事件(Publish Event)到調(diào)度中心,也就是該事件觸發(fā)時,由調(diào)度中心統(tǒng)一調(diào)度(Fire Event)訂閱者注冊到調(diào)度中心的處理代碼。

結(jié)果

調(diào)用

html  調(diào)用 端 綁定 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>s后重發(fā)</span>

          </button>

     </li>  

     <li class="block-verification fix">  

          <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 調(diào)用 看下面代碼注釋

/**
 * function verficationCallback 回調(diào)方法
 * [$btn1 description]
 * data-bind-phone="name"
 * @ message {[type]}   發(fā)生變化的字段phone
 * @ prop_name {[type]}  字段的value  name
 * @ target {[type]}      目標jsdom對象;
 * @ targetValue {[type]}  目標jsdom對象的value
 */// 監(jiān)聽回調(diào)函數(shù),函數(shù)會拿到targetvalue 的值, target js dom對象,便于對變化的字段進行操作?。?!
var User= require('../../entry/module/twoWayAudio.js');
var phone = new User('phone',verficationCallback);
 function verficationCallback(message,prop_name,target,targetValue){
}

引入的源代碼 twoWayAudio

function DataBinder(object_id,verficationCallback){  
// 創(chuàng)建一個簡單的pubSub對象
var pubSub = {
callbacks: {},
on: function(msg,callback) {
this.callbacks[msg] = this.callbacks[msg] || [];
this.callbacks[msg].push(callback);
},
publish: function(msg) {
\

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

data_attr = "data-bind-" + object_id,
message   = object_id + ":change",
changeHandler = function(event) {
var target = event.target || event.srcElement, // IE8兼容
prop_name = target.getAttribute(data_attr);
if (prop_name && prop_name !== "") {
if(verficationCallback){
var targetValue = target.value;
verficationCallback (message,prop_name,target,targetValue);
}
pubSub.publish(message,prop_name,target.value);
}
};

// 監(jiān)聽事件變化,并代理到pubSub
if (document.addEventListener) {
document.addEventListener("keyup",changeHandler,false);
} else{
// IE8使用attachEvent而不是addEventListenter
document.attachEvent("onkeyup",changeHandler);
};

// pubSub將變化傳播到所有綁定元素
pubSub.on(message,function(event,prop_name,new_val){
var elements = document.querySelectorAll("[" + data_attr + "=" +prop_name + "]"),
tag_name;
for (var i = 0,len = elements.length; i < len; i++) {
tag_name = elements[i].tagName.toLowerCase();
if (tag_name === "input" || tag_name === "textarea" || tag_name === "select") {
elements[i].value = new_val;

} else{
elements[i].innerHTML = new_val;
};
};
})
return pubSub;
}

function User(uid,verficationCallback) {  
var binder = new DataBinder(uid,verficationCallback),
  user   = {
  attribute : {},
  // 屬性設(shè)置器使用數(shù)據(jù)綁定器pubSub來發(fā)布
  set : function(attr_name,val) {
  this.attribute[attr_name] = val;
  binder.publish(uid + ":change",attr_name,val,this);
  },
  get : function(attr_name) {
  return this.attribute[attr_name];
  },
  _binder : binder
  };

binder.on(uid + ":change",function(event,attr_name,new_val,initiator) {
if (initiator !== user) {
user.set(attr_name,new_val);
}
});
return user;
}
module.exports = User;
// phone.set( "name", "lwl" );  
// phone.set( "tishi", "提示" );  

替代解決方案

上面只是在掩飾雙向數(shù)據(jù)綁定,其實這種需求可以更簡單的實現(xiàn) 嘿嘿

 $('.block-phone #phone')[0].oninput=function(){
 console.log($(this))
}

總結(jié)

到此這篇關(guān)于js項目中雙向數(shù)據(jù)綁定的簡單實現(xiàn)方法的文章就介紹到這了,更多相關(guān)js雙向數(shù)據(jù)綁定實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用javascript獲取地址欄參數(shù)

    用javascript獲取地址欄參數(shù)

    用javascript獲取地址欄參數(shù)...
    2006-12-12
  • p5.js入門教程之圖片加載

    p5.js入門教程之圖片加載

    這篇文章主要介紹了p5.js入門教程之圖片加載,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Javascript & DHTML DOM基礎(chǔ)和基本API

    Javascript & DHTML DOM基礎(chǔ)和基本API

    DOM是文檔對象模型(Document Object Model,是基于瀏覽器編程(在本教程中,可以說就是DHTML編程)的一套API接口,W3C出臺的推薦標準,每個瀏覽器都有一些細微的差別,其中以Mozilla的瀏覽器最與標準接近。
    2008-07-07
  • js實現(xiàn)的Easy Tabs選項卡用法實例

    js實現(xiàn)的Easy Tabs選項卡用法實例

    這篇文章主要介紹了js實現(xiàn)的Easy Tabs選項卡用法,以完整實例形式較為詳細的分析了JavaScript鼠標事件動態(tài)操作頁面元素樣式的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • javaScript Array(數(shù)組)相關(guān)方法簡述

    javaScript Array(數(shù)組)相關(guān)方法簡述

    javaScript Array(數(shù)組)相關(guān)方法簡述,讓大家更快的熟悉array數(shù)組的用法。
    2009-07-07
  • java和javascript獲取word文檔的書簽位置對比

    java和javascript獲取word文檔的書簽位置對比

    這篇文章主要介紹了java和javascript獲取word文檔的書簽位置代碼對比,需要的朋友可以參考下
    2014-06-06
  • Bootstrap如何創(chuàng)建表單

    Bootstrap如何創(chuàng)建表單

    這篇文章主要為大家詳細介紹了Bootstrap如何創(chuàng)建表單,介紹了Bootstrap表單的三種類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 用js編寫簡單的貪吃蛇小游戲

    用js編寫簡單的貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了用js編寫簡單的貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • TypeScript使用vscode監(jiān)視代碼編譯的過程

    TypeScript使用vscode監(jiān)視代碼編譯的過程

    這篇文章主要介紹了TypeScript使用vscode監(jiān)視代碼編譯,使用tsc 文件名稱可以將ts文件轉(zhuǎn)化為js文件,js文件可以引入在html文件中直接使用,需要的朋友可以參考下
    2021-12-12
  • taro小程序添加骨架屏的實現(xiàn)代碼

    taro小程序添加骨架屏的實現(xiàn)代碼

    這篇文章主要介紹了taro小程序添加骨架屏的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論