亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

js實現一個簡單的MVVM框架示例

2024-05-06 16:42:00
字體:
來源:轉載
供稿:網友

以前都是默默地看園子里的文章,猥瑣的點贊,今天也分享一下自己用js實現的一個簡單mvvm框架。

最初只做了自動綁定事件,后面又參考學習了vue,knouckout以及argular實現方式,以及結合自己做WPF的一些經驗,增加了屬性綁定,今天又稍微整理了下,完善了部分功能,把代碼提交到了碼云:https://gitee.com/zlj_fy/Simple-MVVM

先簡單介紹下用法:

<form class="form-horizontal" role="form" data-context="TestController">  <div class="form-group">   <legend>Form title</legend>  </div>  <div class="form-group">   <div class="col-sm-6 col-sm-offset-2">    <input type="text" class="form-control" bind-val="age,format=format" style="margin:5px 0" />    <input type="text" class="form-control" bind-val="desc" style="margin:5px 0" />    <input type="range" min="10" max="300" bind-val="age" step="10" class="form-control" style="margin:5px 0" />    <input type="button" class="btn btn-primary" value="更新" style="margin:5px 0" on-click="update" />   </div>  </div> </form> <script>  var TestController = {   data: {    name: 'xiaoming',    age: 3,    desc: function() {            return this.name + ' likes looking little movie. he should take care of his body'     }   },   format: function(val) {    return val + '歲'   },   update: function() {    this.name = 'this is a test'    this.age = 18   }  }  $('body').controller() </script>

首先定義一個控制器,可以是json對象,也可一是一個function,然后在頂層的元素定義data-context=“[控制器名稱]”就可以將該控制器綁定到該節點底下所有元素。如果元素后代存在嵌套Controller,則其所在的元素以下子元素作用域指向子控制器。

1.監控屬性以及復雜屬性

所有屬性必須定義在data節點下,如果里面的屬性定義成function則認為是復雜屬性(例如desc),復雜屬性是只讀的,重新賦值的話會提示錯誤。

綁定到html元素上的格式:"{屬性名,fomat=[控制器方法]}",屬性名支持嵌套屬性,例如(a.b);屬性名不支持表達式,考慮了覺得不是很有必要,完全可以使用復雜屬性去代替,當前缺點是業務復雜的話可能造成大量復雜屬性;屬性名右邊是可選參數,目前只有format,也就是屬性顯示在html上的轉換方法。

2.指令

綁定指令語法是 bind-{指令}的形式,目前只實現了val,attr,text,html,template,其實可以看出,前面4個都只是簡單封裝了jqeury方法,template是用到了jquery-tmpl插件實現的,如果你需要更多的指令,你可以自己去擴展,只需要實現init初始加載方法(接收當前的observer參數),以及update方法(參數說明:對應的jquery元素,最新的值,當前控制器實例);如果是擴展已有的指令,默認會覆蓋原有的。如下:

$.controller.addDirective("val", {  init: function (observer) {   if (observer.$ele.is('input,select')) {    //監聽onchange事件    observer.$ele.on('input propertychange', function () {     var newVal = $(this).val()     observer.writeValue(newVal)    })   }  },  update: function ($ele, newVal, controller) {   $ele.val && $ele.val(newVal)  } })

3.事件

綁定事件語法:on-{事件}=“{控制器方法},type=on/one”,控制器方法右邊是可選參數,目前只有綁定類型on/one,默認是on;控制器方法接收兩個參數,一個是可在對應事件的元素上設置初始參數,一個是event事件參數;

<button type="button" class="btn btn-primary" data-page="1" on-click="refesh">查詢</button>

4.方法

直接使用this.屬性名,就可以直接訪問對應data節點下的屬性。

5.鉤子

init以及created,init是在監聽所有屬性之后編譯dom之前,可以在這方法上初始化參數;created是編譯dom元素之后。

其中控制器默認實現了extend繼承方法,可以繼承另一個控制器,必須在init方法中使用。當前你也可以自己使用原型繼承的方式去實現。

init: function () {    this.extend(PageController)   },   created: function () {    //TODO   },

6.擴展

相信大家在做項目的時候肯定都會有一套公用的組件,那么可以像下面那樣擴展,默認對應的組件掛載到所有的控制器示例下面,就可以之間在對應的方法下直接調用了: this.http.post();

不過有一個建議,就是盡量統一將回調方法的作用域指向控制器,這樣開發不至于老是出現作用域的問題。

$.controller.extend({   utils: utils,   notify: $.notify,   modal: $.modal,   http: $.http,   alert: $.alert  })

7.原理以及代碼分析(待續...)

整個js代碼量只有300多行,所以實現的比較簡單,有很多方面是沒有考慮到的,還有一些功能是想實現卻沒有去做的,目前不支持數組變化檢測,以及局部更新相關dom。

以上這篇js實現一個簡單的MVVM框架示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本精品在线| 国产欧美亚洲精品| 亚洲第一精品久久忘忧草社区| 欧美黑人xxxⅹ高潮交| 国产丝袜高跟一区| 成人福利视频在线观看| 5566成人精品视频免费| 国产精品视频中文字幕91| 欧美性xxxx极品高清hd直播| 国产精品久久久久久久久久久久久| 日韩精品中文字幕在线观看| 欧美中文字幕在线观看| 精品久久久久久久久中文字幕| 国产精品一区二区三区免费视频| 伊人久久久久久久久久| 国产91精品久久久久| 一本色道久久88精品综合| 日韩激情视频在线| 日韩福利视频在线观看| 久久精品视频99| 国产91成人video| 国产va免费精品高清在线观看| 亚洲专区在线视频| 这里只有精品丝袜| 最近2019中文字幕mv免费看| 少妇av一区二区三区| 欧美高清自拍一区| 亚洲国产精品电影在线观看| 国产精品日韩在线一区| 91av在线网站| 久久精品国产亚洲一区二区| 欧美电影免费观看大全| 国产噜噜噜噜噜久久久久久久久| 成人黄色在线免费| 国产精品日日做人人爱| 精品视频—区二区三区免费| 自拍偷拍亚洲欧美| 精品中文视频在线| 亚洲精品免费在线视频| 成人性生交大片免费看视频直播| 在线看国产精品| 日韩经典中文字幕| 91老司机精品视频| 国产精品视频自在线| 日韩一区视频在线| 日韩精品中文字| 欧美激情在线视频二区| 97视频com| 国产做受69高潮| 欧美体内谢she精2性欧美| 亚洲视屏在线播放| 日韩va亚洲va欧洲va国产| 在线看日韩欧美| 国产91露脸中文字幕在线| 亚洲精品国精品久久99热一| 日韩精品亚洲视频| 国内精品久久久久伊人av| 日韩欧美一区二区三区| 国产精品高潮在线| 亚洲欧美在线免费| 色偷偷噜噜噜亚洲男人的天堂| 欧美成人午夜免费视在线看片| 欧美精品18videos性欧美| 亚洲韩国日本中文字幕| 欧美一级视频在线观看| 日韩av手机在线观看| 久久久久久久久爱| 97精品在线观看| 亚洲第一天堂av| 亚洲精品美女在线| 色偷偷91综合久久噜噜| 国产在线播放91| 亚洲国产日韩欧美综合久久| 亚洲国产美女精品久久久久∴| 日韩免费在线播放| 91av在线视频观看| 久久国产精品影片| 日韩一区二区精品视频| 欧美一区亚洲一区| 538国产精品一区二区在线| 亚洲精品久久7777777| 狠狠躁夜夜躁人人躁婷婷91| 欧美乱人伦中文字幕在线| 国产精品黄视频| 91视频免费网站| 国产精品网红直播| 亚洲欧美综合区自拍另类| 日韩在线视频观看正片免费网站| 欧美高跟鞋交xxxxhd| 国产精品福利小视频| 久久偷看各类女兵18女厕嘘嘘| 中文字幕久精品免费视频| 亚洲精品久久久久中文字幕二区| 欧美性猛交xxxx免费看久久久| 黄色一区二区三区| 亚洲精品av在线| 91影院在线免费观看视频| 亚洲乱码国产乱码精品精| 色www亚洲国产张柏芝| 国产亚洲xxx| 中文字幕精品久久久久| 国产精品白嫩美女在线观看| 国产一区二区香蕉| 国产精品精品视频一区二区三区| 国产日韩欧美电影在线观看| 欧美日韩亚洲系列| 欧美日韩国产限制| 精品视频在线观看日韩| 欧美电影免费观看网站| 欧美精品在线免费观看| 一区二区在线视频播放| 成人网在线视频| 亚洲国产一区二区三区四区| 久久综合伊人77777蜜臀| 久久91亚洲人成电影网站| 欧洲永久精品大片ww免费漫画| 日韩欧美极品在线观看| 最近2019年好看中文字幕视频| 国产精品视频内| 国产精品夜色7777狼人| 最近2019中文字幕在线高清| 亚洲一区精品电影| 久久精品国产久精国产思思| 国产欧美一区二区三区久久人妖| 欧美视频精品一区| 日韩欧美亚洲综合| 日韩精品在线播放| 日韩欧美中文字幕在线播放| 欧美小视频在线观看| 欧美日韩国产页| 欧美老女人bb| 国产精品一二区| 精品亚洲一区二区三区在线播放| 伊人男人综合视频网| 亚洲三级av在线| 91久久久精品| 亚洲bt欧美bt日本bt| 久久免费观看视频| 欧美贵妇videos办公室| 92看片淫黄大片欧美看国产片| 国产精品久久久久久久久免费| 午夜精品国产精品大乳美女| 中文字幕在线国产精品| 国产精品第七影院| 国产精品视频久久久| 91精品国产91久久久久| 日韩高清人体午夜| 亚洲人成啪啪网站| 国产精品爽爽爽| 国产一区二区视频在线观看| 在线观看久久av| 一本大道亚洲视频| 亚洲国产美女久久久久| 国产日产欧美精品| 成人亚洲综合色就1024| 国产欧美精品一区二区三区-老狼| 久久这里有精品视频| 欧美成人中文字幕| 日韩av电影院| 日韩高清中文字幕| 26uuu日韩精品一区二区| 在线精品视频视频中文字幕| 亚洲欧美日韩中文在线制服| 精品偷拍一区二区三区在线看|