日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

淺析Angular變更檢測中的訂閱異步事件


Angular的變更檢測是否支持所有的異步事件呢?如果支持,可以列出來嗎?如果有些不支持,哪些不支持呢?

如何訂閱異步事件

只要發生了異步操作,Angular就后進行變更檢測,那么Angular是如何訂閱(感知)到異步事件的呢?也就是說,當異步事件執行的時候,Angular是怎么知道的呢?先來了解一下zone.js。


zone.js

zone.js 提供了一種稱為zone的機制,用于封裝和攔截瀏覽器中的異步任務,還提供了異步生命周期鉤子和統一的異步錯誤處理機制。

zone.js是通過打補丁的方式來對瀏覽器中常見方法和元素進行攔截,比如setTimeoutHTMLElement.prototype.onclick。Angular在啟動時會利用zone.js修補幾個瀏覽器API,從而去實現異步事件的捕獲,并在捕獲事件后調用變更檢測。

package.json如下示例:

{
  "dependencies": {  
     ...
    "zone.js": "~0.10.2"
  }
}

可以簡單來看一下zone.js。


淺析Angular變更檢測中的訂閱異步事件


比如,在Vue2中的數據響應式,我們都知道它是使用了Object.defineProperty來實現數據變化的攔截,但是它存在很多問題,它只可以監聽對象的屬性變化,但是對于數組的變化時無能為力的。數組原型中有7個方法可以引起數組的變化,對于這些方法Vue都需要感知到他們,那怎么實現呢?拿push方法作為例子,需要把原始的push方法覆蓋掉,實現一個新的push,新的push方法要保留原始push方法的功能,還要通知依賴進行更新。

zone.js中的實現和這個思路是一樣的,來看一段簡化的代碼模擬一下setTimeout的補丁過程:

function setTimeoutPatch() {
  // 存儲原始的setTimeout
  var originSetTimeout = window['setTimeout'];
  // 對瀏覽器原生方法的包裹封裝
  window.setTimeout = function () {
      return global['zone']['setTimeout'].apply(global.zone, arguments);
  };
  // 創建包裹方法,提供給上面重寫后的setTimeout使用
  Zone.prototype['setTimeout'] = function (fn, delay) {
    // 先調用原始方法
   originSetTimeout.apply(window, arguments);
   // 執行完原始方法后就可以做其他攔截后需要進行的操作了
   ...
  };
}

是不是對zone.js的基本原理有了了解了呢。


分享到:
標簽:Angular變更檢測 訂閱異步事件
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定