總體說明
做前端當然少不了ajax的使用,使用dojo的童鞋都知道dojo是基于子產品化管理的前端架構,其中對ajax的處理位于dojo/request子產品。一般情況下我們使用ajax請求隻需要引入dojo/request子產品,然後按照文檔的說明制定參數即可。實際上dojo在這一子產品的進行中抽象了很多概念:
平台偵探器:dojo/request/default
請求分發器:dojo/request/registry
全局通知器:dojo/request/notify
資料傳輸器:dojo/request/xhr dojo/request/script dojo/request/iframe dojo/request/node
資料轉化器:dojo/request/handlers
處理器的總體關系如下圖所示:
正是這些概念使得dojo在ajax請求上能夠提供強大的擴充性和簡捷的接口。
provider
請求傳輸器被稱為provider,dojo架構自身提供了以下4個provider
dojo/request/xhr 提供跨浏覽器的xmlhttprequest,在浏覽器端它被作為預設的provider
dojo/request/node 用于node平台的異步請求,在node下呗當做預設的provider。dojo是可以運作在node平台下的,當然需要做一些配置,這是另一篇文章的主要内容
dojo/request/iframe 不重新整理浏覽器傳輸form表單,在檔案上傳時經常用到
dojo/request/script 常以jsonp方式來進行跨域請求
關于這幾個provider的詳細講解請繼續關注下一篇文章
default
一般情況下我們發送ajax請求時隻需引入dojo/request即可,實際上這是在default中根據不同的運作平台自動給我們提供了一個預設的provider。
dojo/domready
dojo/text 用于加載靜态資源檔案
dojo/i18n 加載國際化語言檔案
dojo/has 用于特性檢測
dojo/require
當在define或require中一個子產品引用包含一個!,dojo的加載器會自動将這個子產品引用字元串在!處分開,左邊部分作為一個子產品引用對待,右邊部分,等待左邊子產品加載完畢後交由子產品的load方法處理;
關于load函數的幾個參數:
id:代表!右側部分
parentrequire:上下文智能的require請求器
loaded:id子產品加載完畢後的回調
config:猜測是dojo/_base/config
後三個參數是dojo自己來處理,一般情況下我們不需要關心。
關于插件還要在說幾句:
dojo中不會像緩存module一樣緩存插件所加載的資源比如:我們可以多次引用同一個module,但是這個module隻會加載一次,這是amd規範所強制規定的。但是我如果多次dojo/text!./template.html這個template.html會被加載多次。
notify
最後的一句:util.notify= notify; util将notify與provider關聯起來。
registry
該子產品可以在不同的情況下使用不同的provider;比對的條件可以是正規表達式、字元串或者函數。通過registry可以根據不同的條件注冊不同的provider。
以下便是registry的源碼:
handlers
dojo中提供了以下三種資料轉化器:
此外,handlers有跟registry類似的register方法,可以讓我們自定義資料轉化器。
如果您看完本篇文章感覺不錯,請點選一下下方的推薦來支援一下部落客,謝謝!