目录javascript
学习地址
迷你MVVM框架,解决双向绑定,减小DOM操做(各类选择器),下降开发代码量。以ms-进行属性标记,事件绑定,是avalon绑定系统的一部分。隐形JQuery,有了绑定,咱们能够更专一于业务逻辑自己,而不是技术。css
工做原理:
框架在DOMReady时扫描DOM树,将视图中的绑定属性与{{}}插值表达式抽取出来,转换为求值函数与视图刷新函数。html
方式:
经过avalon.define定义ViewModel,必须指定$id,不想监听的属性经过$skipArray:["name"]进行过滤。java
注意:ajax
更新vm中的属性,普通属性直接赋值,数组中类型必须一致,对象用model中用set方法赋值(它有两个参数,第一个是index,第2个是新值)数组
<script> var model : avalon.define({ $id: "update", aaa : "str", bbb : false, ccc : 1223, time : new Date, simpleArray : [1, 2, 3, 4], objectArray : [{name: "a"}, {name: "b"}, {name: "c"}, {name: "d"}], object : { o1: "k1", o2: "k2", o3: "k3" }, simpleArray : [1, 2, 3, 4], objectArray : [{name: "a", value: "aa"}, {name: "b", value: "bb"}, {name: "c", value: "cc"}, {name: "d", value: "dd"}], object : { o1: "k1", o2: "k2", o3: "k3" } }) setTimeout(function() { //若是是更新简单数据类型(string, boolean, number)或Date类型 model.aaa = "这是字符串" model.bbb = true model.ccc = 999999999999 var date = new Date model.time = new Date(date.setFullYear(2005)) }, 2000) setTimeout(function() { //若是是数组,注意保证它们的元素的类型是一致的 //只能全是字符串,或是全是布尔,不能有一些是这种类型,另外一些是其余类型 //这时咱们可使用set方法来更新(它有两个参数,第一个是index,第2个是新值) model.simpleArray.set(0, 1000) model.simpleArray.set(2, 3000) model.objectArray.set(0, {name: "xxxxxxxxxxxxxxxx", value: "xxx"}) }, 2500) setTimeout(function() { model.objectArray[1].name = "5555" }, 3000) setTimeout(function() { //若是要更新对象,直接赋给它一个对象,注意不能将一个VM赋给它,能够到VM的$model赋给它(要不会在IE6-8中报错) model.object = { aaaa: "aaaa", bbbb: "bbbb", cccc: "cccc", dddd: "dddd" } }, 3000) </script>
{{}}插值表达式,{{}}里面能够添加各类过滤器(以|进行标识)。插值表达式{{}}在绑定属性的使用,只限那些能返回字符串的绑定属性,如ms-attr、ms-css、ms-include、ms-class、 ms-href、 ms-title、ms-src等。一旦出现插值表达式,说明这个整个东西分红可变的部分与不可变的部分,{{}}内为可变的,反之亦然。 若是没有{{}}说明整个东西都要求值,又如ms-include="'id'",要用两种引号强制让它的内部不是一个变量。ruby
做用域绑定,就近原则。在选择是继承仍是组合的问题上,avalon倾向组合。组合的使用范例就是CSS,所以也有了ms-important的诞生。而ms-important就至关于CSS的important语句,强制这个区域使用此ViewModel,再也不往上查找同名属性或方法!框架
<div ms-controller="AAA"> <div>{{name}} : {{color}}</div> <div ms-controller="BBB"> <div>{{name}} : {{color}}</div> <div ms-controller="CCC"> <div>{{name}} : {{color}}</div> </div> <div ms-important="DDD"> <div>{{name}} : {{color}}</div> </div> </div> </div>
ms-click ms-dblclick ms-mouseout ms-mouseover ms-mousemove ms-mouseenter ms-mouseleave ms-mouseup ms-mousedown ms-keypress ms-keyup ms-keydown ms-focus ms-blur ms-change ms-scroll ms-animation ms-on-*
ms-skip --> ms-important --> ms-controller --> ms-if --> ms-repeat --> ms-if-loop --> ...-->ms-each --> ms-with --> ms-duplex函数
ms-skip 直接跳过,不会扫描其余属性和子孙节点
ms-important, ms-controller这两个用于圈定VM的做用域的绑定属性
ms-if="bool",一样隐藏,但它是将元素移出DOM。这个功能直接影响到CSS :empty伪类的渲染结果,所以比较有用。
ms-duplex除了负责将VM中对应的值放到表单元素的value中,还对元素偷偷绑定一些事件,用于监听用户的输入从而自动刷新VM。oop
用法为ms-css-name="value"
用法为ms-data-name="value", 用于为元素节点绑定HTML5 data-*属性。