1. 程式人生 > >MVVM(三)資料劫持-->資料繫結

MVVM(三)資料劫持-->資料繫結

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()
         * 訊息訂閱與釋出