初期只做了机动绑定事件,后天也分享一下温馨用js实现的2个简易mvvm框架

开首都在此之前所未闻地看园子里的稿子,猥琐的点赞,明天也分享一下友好用js完成的3个简单mvvm框架。

原先都以名不见经传地看园子里的稿子,猥琐的点赞,前些天也分享一下温馨用js完成的2个粗略mvvm框架。

早期只做了自行绑定事件,前边又参考学习了vue,knouckout以及argular完成情势,以及构成自己做WPF的部分经验,扩张了质量绑定,明日又有个别整理了下,完善了一些成效,把代码提交到了码云:https://gitee.com/zlj\_fy/Simple-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>
 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.督察属性以及错综复杂属性

首先定义3个控制器,能够是json对象,也可一是二个function,然后在顶层的成分定义data-context=“[控制器名称]”就能够将该控制器绑定到该节点底下全体因素。若是元素后代存在嵌套Controller,则其所在的因素以下子成分功用域指向子控制器。

具有属性必须定义在data节点下,如若内部的性情定义成function则以为是犬牙相制属性(例如desc),复杂属性是只读的,重新赋值的话会提示错误。

 

绑定到html成分上的格式:”{属性名,fomat=[控制器方法]}”,属性名补助嵌套属性,例如(a.b);属性名不协理表明式,考虑了觉得不是很有须求,完全能够利用复杂属性去顶替,当前缺点是工作复杂的话恐怕引致大量错综复杂属性;属性名右侧是可选参数,近日唯有format,也便是性质彰显在html上的转换方法。

1.监察属性以及错综复杂属性

2.指令

拥有属性必须定义在data节点下,若是内部的习性定义成function则以为是错综复杂属性(例如desc),复杂属性是只读的,重新赋值的话会提醒错误。

绑定指令语法是
bind-{指令}的样式,近期只兑现了val,attr,text,html,template,其实能够看到,后面6个都只是不难封装了jqeury方法,template是用到了jquery-tmpl插件落实的,倘使你要求更加多的吩咐,你能够本身去扩张,只必要贯彻init初阶加载方法(接收当前的observer参数),以及update方法(参数表明:对应的jquery成分,最新的值,当前控制器实例);假若是扩充已部分指令,暗中同意会覆盖原有的。如下:

绑定到html成分上的格式:”{属性名,fomat=[控制器方法]}”,属性名辅助嵌套属性,例如(a.b);属性名不援助表明式,考虑了觉得不是很有必不可少,完全能够采取复杂属性去顶替,当前缺点是事情复杂的话或者造成大气错落有致属性;属性名右侧是可选参数,近期只有format,也等于性质展现在html上的转换方法。

$.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)
  }
 })

2.指令

3.事件

绑定指令语法是
bind-{指令}的花样,方今只兑现了val,attr,text,html,template,其实能够观望,前边5个都只是不难封装了jqeury方法,template是用到了jquery-tmpl插件落到实处的,若是你需求越来越多的指令,你能够本人去扩张,只供给实现init初叶加载方法(接收当前的observer参数),以及update方法(参数表明:对应的jquery成分,最新的值,当前控制器实例);假使是扩张已部分指令,私下认可会覆盖原有的。如下:

绑定事件语法:on-{事件}=“{控制器方法},type=on/one”,控制器方法左边是可选参数,如今唯有绑定类型on/one,暗许是on;控制器方法接收八个参数,贰个是可在对应事件的要素上设置开端参数,三个是event事件参数;

 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     })
<button type="button" class="btn btn-primary" data-page="1" on-click="refesh">查询</button>

 

4.方法

3.事件

直白动用this.属性名,就足以一直访问对应data节点下的习性。

绑定事件语法:on-{事件}=“{控制器方法},type=on/one”,控制器方法左边是可选参数,最近只有绑定类型on/one,暗中同意是on;控制器方法接收八个参数,三个是可在相应事件的成分上安装初始参数,2个是event事件参数;

5.钩子

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

init以及created,init是在监听全数属性之后编写翻译dom从前,能够在那格局上开首化参数;created是编写翻译dom元素之后。

 

澳门永利备用网址,内部控制器默许实现了extend继承方法,能够继续另2个控制器,必须在init方法中利用。当前您也能够自个儿行使原型继承的方法去贯彻。

4.方法

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

直接利用this.属性名,就足以一直访问对应data节点下的性情。

6.扩展

5.钩子

信任我们在做项指标时候自然都会有一套公用的零件,那么能够像上边这样扩张,暗中同意对应的组件挂载到具备的控制器示例下边,就足以之间在相应的法子下直接调用了:
this.http.post();

init以及created,init是在监听全体属性之后编写翻译dom在此以前,可以在那措施上开首化参数;created是编写翻译dom元素之后。

但是有3个提出,正是尽恐怕合并将回调方法的成效域指向控制器,那样开发不至于老是出新作用域的难题。

其间控制器暗中同意达成了extend继承方法,能够一而再另3个控制器,必须在init方法中利用。当前你也足以本身行使原型继承的方式去实现。

$.controller.extend({
   utils: utils,
   notify: $.notify,
   modal: $.modal,
   http: $.http,
   alert: $.alert
  })
1             init: function () {
2                 this.extend(PageController)
3             },
4             created: function () {
5                 //TODO
6             },

7.原理以及代码分析(待续…)

 

总体js代码量唯有300多行,所以完结的相比较不难,有不少上边是从未有过设想到的,还有一对成效是想完毕却绝非去做的,近日不帮助数组变化检查和测试,以及部分更新相关dom。

 6.扩展

上述那篇js实现3个简便的MVVM框架示例正是作者分享给大家的全部内容了,希望能给我们三个参照,也冀望大家多多扶助脚本之家。

深信不疑我们在做项目标时候肯定都会有一套公用的零部件,那么能够像上面那样扩张,默许对应的机件挂载到拥有的控制器示例上边,就足以之间在对应的点子下直接调用了:
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。

 

 

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