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

mvvm雙向綁定機(jī)制的原理和實(shí)現(xiàn)代碼(推薦)

 更新時(shí)間:2016年06月07日 15:29:52   投稿:jingxian  
下面小編就為大家?guī)硪黄猰vvm雙向綁定機(jī)制的原理和實(shí)現(xiàn)代碼(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

mvvm框架的雙向綁定,即當(dāng)對(duì)象改變時(shí),自動(dòng)改變相關(guān)的dom元素的值,反之,當(dāng)dom元素改變時(shí),能自動(dòng)更新對(duì)象的值,當(dāng)然dom元素一般是指可輸出的input元素。

1. 首先實(shí)現(xiàn)單向綁定,在指定對(duì)象的屬性值發(fā)生改變時(shí)觸發(fā)callback函數(shù)。

2. 單向綁定可采用ES5新增的defineProperty實(shí)現(xiàn)(或defineProperties),用了ES5注定就不支持IE9以下了,為了防止遞歸死循環(huán)問題,原有屬性需要剪切到一個(gè)私有屬性中保存。

3. 循環(huán)調(diào)用defineProperty定義閉包時(shí)產(chǎn)生作用域的問題,為解決作用域變量對(duì)象的值會(huì)取到最后一次運(yùn)行值問題,多定義一層立即調(diào)用的閉包函數(shù)將值傳入。

4. 我們定義getFN和setFN函數(shù)用于在屬性get和set的時(shí)候觸發(fā),它的功能是對(duì)私有屬性__private的讀寫并觸發(fā)回調(diào)函數(shù)通知UI層更新界面。

5.單向綁定實(shí)現(xiàn)完成后,實(shí)現(xiàn)反向的綁定,即UI層onchange之后觸發(fā)更新數(shù)據(jù),這個(gè)相對(duì)比較容易,在dom中通過自定義屬性bindKey關(guān)聯(lián)model的值變化,監(jiān)聽使用oninput事件,相比onchange的好處是可以實(shí)時(shí)變化不用等失焦,而且對(duì)右鍵粘貼、菜單粘貼,拖動(dòng)文字進(jìn)文本框等方式都可以觸發(fā),完全無死角,缺點(diǎn)是只支持IE9以上,但是在IE9以下有等價(jià)的onpropertychange可以用還是能兼容的。

6.總結(jié),雙向綁定的原理并不復(fù)雜,整體代碼不超過50行,非常精簡(jiǎn),不過還是有一些技術(shù)含量,下面是完整的代碼,如果不想使用龐大的框架,可以用一下。ie9以下是不支持的,如要支持ie9以下可以使用avalon,它用vbs做了get,set存取器的封裝,這點(diǎn)還是比較強(qiáng)大的。

html:

<div id="container">
  <p>
  name:<input type="text" bindkey="userName">
  </p>
  <p>
  age:<input type="text" bindkey="age">
  </p>
<div>

js:

<script type="text/javascript">
  window.Model={
    userName:"windy",
    age:34,
    skill:["javascript","html","css","jquery","node"],
    
  }
  function bindingModel(model,changeCallback){
    var propertiesMap={};
    model.__private={};
    function getFn(name){
      var result=this.__private[name]
      console.log("get value:"+name+"="+ result);
      return result;
    };
    function setFn(name,val){
      if(this.__private[name]!=val){
        console.log("set value:"+name+"="+val);
       
        this.__private[name]=val;

        if(changeCallback){
          changeCallback(name,val);
        }
      }
    };
    for(elem in model){
      if(model.hasOwnProperty(elem) && elem!="__private" && typeof(model[elem])!="function"){
        (function(propName,propValue){
          model.__private[propName]=propValue;// init value
          propertiesMap[propName]={
            get:function(){ return getFn.call(this,propName)},
            set:function(v){ return setFn.call(this,propName,v)},
            //value:model[elem],
            //writable: true,
            enumerable: true,
            configurable: true
          }
        })(elem,model[elem]);
      }
    }
    Object.defineProperties(model,propertiesMap)
    
  }
  function bindingBoth(model,dom){
    dom.find("[bindkey]").each(function(item){
      var key=$(this).attr("bindkey");
      $(this).val(model[key]);
      $(this).bind("input",function(){
        model[key]=$(this).val();
      })
    });
    bindingModel(model,function(name,val){
      var el=dom.find("[bindkey="+name+"]");
      if(el.val()!=val){
        el.val(val);
      }
      
    });
  }
  bindingBoth(window.Model,$("#container"))
  </script>

以上這篇mvvm雙向綁定機(jī)制的原理和實(shí)現(xiàn)代碼(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript執(zhí)行效率與性能提升方案

    JavaScript執(zhí)行效率與性能提升方案

    如何提升JavaScript執(zhí)行效率與性能在前端開發(fā)中位于一個(gè)很重要的地方,這節(jié)來研究下如何在平時(shí)做項(xiàng)目過程中,提升JavaScript性能與運(yùn)行效率,需要的朋友可以參考下
    2012-12-12
  • bootstrap實(shí)現(xiàn)每隔5秒自動(dòng)輪播效果

    bootstrap實(shí)現(xiàn)每隔5秒自動(dòng)輪播效果

    這篇文章主要介紹了bootstrap實(shí)現(xiàn)每隔5秒自動(dòng)輪播效果,可以自己設(shè)置輪播間隔時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 微信小程序顯示下拉列表功能【附源碼下載】

    微信小程序顯示下拉列表功能【附源碼下載】

    這篇文章主要介紹了微信小程序顯示下拉列表功能,涉及微信小程序navigator組件導(dǎo)航及頁面加載相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • 微信小程序自定義導(dǎo)航欄及其封裝的全過程

    微信小程序自定義導(dǎo)航欄及其封裝的全過程

    在小程序項(xiàng)目開發(fā)過程中常遇到自定義導(dǎo)航欄的需求,所以下面這篇文章主要給大家介紹了關(guān)于微信小程序自定義導(dǎo)航欄及其封裝的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 前端JS運(yùn)算精度丟失的解決方法

    前端JS運(yùn)算精度丟失的解決方法

    前端在處理小數(shù)或大整數(shù)時(shí),由于 JavaScript 的 Number 類型使用 IEEE 754 雙精度浮點(diǎn)數(shù)表示,可能會(huì)出現(xiàn)精度丟失問題(如 0.1 + 0.2 = 0.30000000000000004),以下是常見的解決方案,需要的朋友可以參考下
    2025-03-03
  • 使用javascript創(chuàng)建快捷方式的簡(jiǎn)單實(shí)例

    使用javascript創(chuàng)建快捷方式的簡(jiǎn)單實(shí)例

    這篇文章介紹了使用javascript創(chuàng)建快捷方式的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-08-08
  • c#和Javascript操作同一json對(duì)象的實(shí)現(xiàn)代碼

    c#和Javascript操作同一json對(duì)象的實(shí)現(xiàn)代碼

    剛開始學(xué)Javascript,接觸到j(luò)son對(duì)象,json可以看作是用于客戶端數(shù)據(jù)實(shí)體對(duì)象的載體。json對(duì)象一般都是通過ajax方式傳送給服務(wù)層
    2012-01-01
  • 原生js實(shí)現(xiàn)淘寶放大鏡效果

    原生js實(shí)現(xiàn)淘寶放大鏡效果

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)放大鏡效果,制作一個(gè)類似于淘寶的放大鏡效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • JS控制GIF圖片的停止與顯示

    JS控制GIF圖片的停止與顯示

    這篇文章主要為大家詳細(xì)介紹了JS控制GIF圖片的停止與顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 一個(gè)簡(jiǎn)單的JavaScript Map實(shí)例(分享)

    一個(gè)簡(jiǎn)單的JavaScript Map實(shí)例(分享)

    下面小編就為大家?guī)硪黄粋€(gè)簡(jiǎn)單的JavaScript Map實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08

最新評(píng)論

北辰区| 军事| 兴和县| 卫辉市| 通道| 浦县| 布尔津县| 宣威市| 鹤峰县| 托克逊县| 宁阳县| 绵阳市| 营山县| 健康| 南京市| 罗平县| 犍为县| 眉山市| 嘉义县| 铜鼓县| 岑巩县| 新晃| 白河县| 中山市| 乌恰县| 南江县| 双牌县| 大同县| 富平县| 随州市| 阿拉尔市| 乌鲁木齐市| 右玉县| 富顺县| 菏泽市| 汾阳市| 平乐县| 西藏| 九寨沟县| 永修县| 米林县|