目錄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-*屬性。