MVVM(三)資料劫持-->資料繫結
阿新 • • 發佈:2018-12-17
1.資料繫結(model==>View):
(1). 一旦更新了data中的某個屬性資料, 所有介面上直接使用或間接使用了此屬性的節點都會更新(更新)
2.資料劫持
(1). 資料劫持是vue中用來實現資料繫結的一種技術
(2). 基本思想: 通過defineProperty()來監視data中所有屬性(任意層次)資料的變化, 一旦變化就去更新介面
3.四個重要物件
(1). Observer
* 用來對data所有屬性資料進行劫持的建構函式
* 給data中所有屬性重新定義屬性描述(get/set)
* 為data中的每個屬性建立對應的dep物件
(2). Dep(Depend)
* data中的每個屬性(所有層次)都對應一個dep物件
* 建立的時機:
* 在初始化define data中各個屬性時建立對應的dep物件
* 在data中的某個屬性值被設定為新的物件時
* 物件的結構
{
id, // 每個dep都有一個唯一的id
subs //包含n個對應watcher的陣列(subscribes的簡寫)
}
* subs屬性說明
* 當一個watcher被建立時, 內部會將當前watcher物件新增到對應的dep物件的subs中
* 當此data屬性的值發生改變時, 所有subs中的watcher都會收到更新的通知, 從而最終更新對應的介面
(3). Compile
* 用來解析模板頁面的物件的建構函式(一個例項)
* 利用compile物件解析模板頁面
* 每解析一個表示式(非事件指令)都會建立一個對應的watcher物件, 並建立watcher與dep的關係
* complie與watcher關係: 一對多的關係
(4). Watcher
* 模板中每個非事件指令或表示式都對應一個watcher物件
* 監視當前表示式資料的變化
* 建立的時機: 在初始化編譯模板時
* 物件的組成
{
vm, //vm物件
exp, //對應指令的表示式
cb, //當表示式所對應的資料發生改變的回撥函式
value, //表示式當前的值
depIds //表示式中各級屬性所對應的dep物件的集合物件
//屬性名為dep的id, 屬性值為dep
}
(5). 總結: dep與watcher的關係: 多對多
* 一個data中的屬性對應對應一個dep, 一個dep中可能包含多個watcher(模板中有幾個表示式使用到了屬性)
* 模板中一個非事件表示式對應一個watcher, 一個watcher中可能包含多個dep(表示式中包含了幾個data屬性)
* 資料繫結使用到2個核心技術
* defineProperty()
* 訊息訂閱與釋出