js完成一个简练的MVVM框架

先前都是名不见经传地看园子里的作品,猥琐的点赞,前天也分享一下协调用js已毕的一个简便mvvm框架。

最初只做了机关绑定事件,后面又参考学习了vue,knouckout以及argular落成格局,以及结合自己做WPF的一对经历,扩充了品质绑定,明天又有些整理了下,完善了一部分机能,把代码提交到了码云:https://gitee.com/zlj\_fy/Simple-MVVM

 

先不难介绍下用法:

 1 <form class="form-horizontal" role="form" data-context="TestController">
 2         <div class="form-group">
 3             <legend>Form title</legend>
 4         </div>
 5         <div class="form-group">
 6             <div class="col-sm-6 col-sm-offset-2">
 7                 <input type="text" class="form-control" bind-val="age,format=format" style="margin:5px 0" />
 8                 <input type="text" class="form-control" bind-val="desc" style="margin:5px 0" />
 9                 <input type="range" min="10" max="300" bind-val="age"  step="10" class="form-control" style="margin:5px 0" />
10                 <input type="button" class="btn btn-primary" value="更新" style="margin:5px 0" on-click="update" />
11             </div>
12         </div>
13     </form>
14 
15     <script>
16         var TestController = {
17             data: {
18                 name: 'xiaoming',
19                 age: 3,
20                 desc: function() {
21             return this.name + ' likes looking little movie. he should take care of his body' 
22                 }
23             },
24             format: function(val) {
25                 return val + '岁'
26             },
27             update: function() {
28                 this.name = 'this is a test'
29                 this.age = 18
30             }
31         }
32         $('body').controller()
33     </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元素,最新的值,当前控制器实例);若是是扩张已有些指令,默许会覆盖原有的。如下:

 1 $.controller.addDirective("val", {

 2         init: function (observer) {
 3             if (observer.$ele.is('input,select')) {
 4                 //监听onchange事件
 5                 observer.$ele.on('input propertychange', function () {
 6                     var newVal = $(this).val()
 7                     observer.writeValue(newVal)
 8                 })
 9             }
10         },
11         update: function ($ele, newVal, controller) {
12             $ele.val && $ele.val(newVal)
13         }
14     })

 

3.事件

绑定事件语法:on-{事件}=“{控制器方法},type=on/one”,控制器方法右侧是可选参数,近年来唯有绑定类型on/one,默许是on;控制器方法接收八个参数,一个是可在对应事件的元素上设置开端参数,一个是event事件参数;

1 <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方法中利用。当前你也得以团结行使原型继承的方法去落到实处。

1             init: function () {
2                 this.extend(PageController)
3             },
4             created: function () {
5                 //TODO
6             },

 

 6.扩展

信任咱们在做项目标时候势必都会有一套公用的组件,那么可以像上边那样增添,默许对应的零部件挂载到具有的控制器示例上边,就能够之间在对应的形式下直接调用了:
this.http.post();

只是有一个提出,就是尽可能合并将回调方法的成效域指向控制器,那样开发不至于老是出新成效域的难题。

1 $.controller.extend({
2             utils: utils,
3             notify: $.notify,
4             modal: $.modal,
5             http: $.http,
6             alert: $.alert
7         }) 

 

7.法则以及代码分析(待续…)

 

全总js代码量唯有300多行,所以达成的相比简单,有好多方面是绝非考虑到的,还有局地效能是想已毕却并未去做的,
眼前不援救数组变化检测,以及部分更新相关dom。

 

 

哎呀,写博客好费时间,先睡了。。。