最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

發(fā)布訂閱者模式

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

訂閱者(Subscriber)把自己想訂閱的事件注冊(Subscribe)到調(diào)度中心(Event Channel),當(dāng)發(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>手機(jī)號</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]}      目標(biāo)jsdom對象;
 * @ targetValue {[type]}  目標(biāo)jsdom對象的value
 */// 監(jiān)聽回調(diào)函數(shù),函數(shù)會拿到targetvalue 的值, target js dom對象,便于對變化的字段進(jìn)行操作?。?!
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年份下拉列表框內(nèi)容為當(dāng)前年份及前后50年

    javaScript年份下拉列表框內(nèi)容為當(dāng)前年份及前后50年

    本文介紹的這個javaScript年份下拉列表框內(nèi)容為當(dāng)前年份及前后50年,默認(rèn)顯示當(dāng)前年份,大家可以學(xué)習(xí)下
    2014-05-05
  • JavaScript setTimeout與setTimeinterval使用案例詳解

    JavaScript setTimeout與setTimeinterval使用案例詳解

    這篇文章主要介紹了JavaScript setTimeout與setTimeinterval使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • JavaScript中?Promise?的使用技巧

    JavaScript中?Promise?的使用技巧

    這篇文章主要介紹了JavaScript中?Promise?的使用技巧,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Three.js加載外部模型的教程詳解

    Three.js加載外部模型的教程詳解

    這篇文章主要介紹了Three.js外部模型加載的教程詳解,在文章給大家補(bǔ)充介紹了three.js 外部模型加載json的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • JS實現(xiàn)頁面數(shù)據(jù)無限加載

    JS實現(xiàn)頁面數(shù)據(jù)無限加載

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)頁面數(shù)據(jù)無限加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JavaScript獲取URL匯總

    JavaScript獲取URL匯總

    在WEB開發(fā)中,許多開發(fā)者都比較喜歡使用javascript來獲取當(dāng)前url網(wǎng)址,本文就此為大家總結(jié)一下比較常用獲取URL的javascript實現(xiàn)代碼
    2015-06-06
  • JavaScript裝箱及拆箱boxing及unBoxing用法解析

    JavaScript裝箱及拆箱boxing及unBoxing用法解析

    這篇文章主要介紹了JavaScript裝箱及拆箱boxing及unBoxing用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理

    跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理

    跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理,小編對JScript的Bug與內(nèi)存管理也不甚了解,所以整理了本篇文章,希望可以解決大家學(xué)習(xí)時的困擾。
    2015-11-11
  • js實現(xiàn)table添加行tr、刪除行tr、清空行tr的簡單實例

    js實現(xiàn)table添加行tr、刪除行tr、清空行tr的簡單實例

    下面小編就為大家?guī)硪黄猨s實現(xiàn)table添加行tr、刪除行tr、清空行tr的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 淺談Javascript中的Function與Object

    淺談Javascript中的Function與Object

    這篇文章主要簡單介紹了Javascript中的Function與Object的關(guān)系,并附上示例分析,對于我們更好的理解Javascript中的Function與Object的關(guān)系很有幫助,有需要的小伙伴參考下。
    2015-01-01

最新評論

韶关市| 廊坊市| 阿城市| 乳山市| 仪陇县| 德昌县| 喀喇| 关岭| 米泉市| 天峨县| 闵行区| 博乐市| 东山县| 黑河市| 霍邱县| 龙海市| 离岛区| 绥宁县| 睢宁县| 东山县| 繁峙县| 盐源县| 麟游县| 万宁市| 德格县| 山阴县| 靖边县| 化州市| 牟定县| 句容市| 南丹县| 峡江县| 安泽县| 成都市| 龙南县| 宜兰县| 桐庐县| 涿州市| 苍山县| 寻甸| 霍邱县|