Amaple 擁有很是強大插件功能,這也是它的突出功能之一,Amaple插件通常表現爲功能塊(函數)或功能塊(包含一系列函數和屬性的Object對象),它除了支持Amaple規範定義的插件外,還支持全部 AMD (點擊瞭解詳情)和 IIFE (點擊瞭解詳情)規範的插件,在 rollup 、 webpack 、 browserify 等模塊打包工具流行的今天,這也意味着幾乎全部的第三方js庫均可以與Amaple協同運做,同時也支持舊式的iife格式js庫。javascript
在安裝Amaple
規範的插件前,咱們需定義一個特定格式的pluginDefinition
(插件定義對象)供Amaple
安裝,這個對象必須包含name
屬性和build
函數,分別表示插件名與構建函數,此構建函數返回的值將做爲插件實體。而後使用am.install(pluginDefinition)
並傳入插件安裝對象pluginDefinition
進行安裝:java
// 插件定義對象 const pluginDefinition = { name : "switch", // 定義插件名,命名規則與變量名的規則相同 // 構建函數,它要求返回一個插件實體 // 無效返回值(undefined、null、0、false等)將會拋出錯誤 // build函數中的this指向的是am對象,因此你可使用它進行組件定義或am屬性的擴展 build : function () { var state = "OFF"; return { press: function () { return state === "OFF" ? "ON" : "OFF"; } }; } }; // 調用後插件將會被安裝,此時就完成了一個名爲switch的插件 // 它是一個含有`press`函數的Object對象。 am.install (pluginDefinition);
在Amaple中,插件也能夠像模塊與組件文件同樣編寫在獨立的js文件中,它也提供了相應的插件載入機制。如咱們可將上面的插件定義代碼單獨放到/plugin/switch.js
文件中。webpack
不管是 Amaple 規範、 amd 和 iife 規範的插件在Amaple中均可以以單獨文件的形式存在,對於這些插件咱們須要載入它們纔可以使用,咱們可在am.startRouter
函數的參數內添加plugin
屬性指定項目依賴的插件路徑信息,這樣Amaple將會自動加載這些插件文件,plugin
具體配置以下:git
am.startRouter( { // ... baseURL : { // ... // 可爲插件文件設置base路徑,全部的插件文件請求路徑都將基於「/plugin」目錄,不設置時默認爲「/」 plugin: "/plugin" }, // plugin的值爲一個數組,經過它來指定項目中依賴的全部插件 // 如下分別表示插件載入的4種方式 plugin: [ // ①.插件路徑字符串,適用於amaple規範的單獨文件插件 // 如上面定義的switch插件可以使用此方式載入,加載路徑依賴baseURL "siwtch", // ②.插件定義對象pluginDefinition,直接傳入此對象後將會安裝此插件 // 與amaple規範的單獨文件插件相比,不需調用am.install函數。 // 這對於webpack等模塊化環境下很是有用,你能夠import任意js庫並經過build函數retuen它進行安裝 { name: "switch", build: function () { ... } }, // ③.amd規範js庫,支持amd規範的全部js庫均可以這樣載入並做爲amaple的插件使用 // url依賴baseURL,且url值爲「http://」、「https://」開頭時可直接載入外網js庫 { format: "amd", name: "anime", url: "amd/animejs" }, // ④.iife規範js庫,iife規範下將會使用global的值做爲全局對象名,並在window對象下尋找它,未定義global時會使用name的值代替global值進行尋找 // url依賴baseURL,且url值爲「http://」、「https://」開頭時可直接載入外網js庫 { format: "iife", name: "lodash", global: "_", url: "iife/lodash" } ] } );
【注意】雖然插件的載入是異步執行的,但請沒必要擔憂,它們會根據plugin
數組按順序進行安裝,這對於擁有依賴的插件是頗有用的,你能夠在plugin
屬性中先載入被依賴的插件,這樣,依賴它們的插件就能夠順利獲取到它們了。
被載入的插件可在模塊、組件以及其餘插件中使用,你能夠在模塊、組件的全部生命週期函數以及插件的build
函數中直接經過插件名接收插件實體對象,這也是極爲簡單的,如在一個模塊中使用 switch 插件:github
new am.Module ( { // 使用插件名直接接收,switch插件將會自動注入到init、mounted函數中 // 其餘生命週期函數中也使用此方法注入對應插件實體 init : function ( switch ) { ... }, mounted : function ( switch ) { ... }, // ... } );
Amaple框架中有util
、http
、event
、promise
四個預約義插件,它們能夠直接在生命週期函數中接收,而不須要在配置對象plugin
屬性中顯式引入。web
此小節主要介紹四個預約義插件的使用方法,但插件使用在Amaple中並非必須的,因此若是你想更快看完此教程,可先跳過此小節的學習。
js工具函數集合segmentfault
參數:api
參數:數組
參數:promise
參數:
Ajax網絡請求插件,它的對象函數get
、post
、request
都實現了
Promise/A+規範,在定義回調函數上,除了普通的異步回調函數傳參外,還支持使用鏈式調用的方式來實現異步回調函數的調用,例如http.get(...).done(function(result) {...}).fail(function(error){...})
或http.get(...).then(function(result){}, function(error){...})
,來指定成功與失敗的回調函數,若是在Promise對象上和回調函數傳參上同時指定了回調函數,則會執行傳參回調函數。成功回調函數successHandler
將接收的參數爲響應內容response
、響應狀態碼status
,響應狀態內容statusText
及自定義XHR對象amXHR
,amXHR
對象屬性詳細以下:
setRequestHeader(header: String, value: String)
參數:
getResponseHeader(header: String)
參數:
getAllResponseHeaders()
overrideMimeType(mimetype: String)
參數:
abort(statusText: String)
參數:
- 類型:Function - 描述:執行Ajax GET請求,它將返回一個Promise對象用於以鏈式調用的方式來實現異步回調函數 - 參數: - url|String:請求url - args?|String、Object:get提交的數據,此參數傳入String時以「k1=v1&k2=v2」的格式傳入,傳入Object時爲一個數據對象 - callback?|Function:請求成功回調函數,。它 - dataType?|String:設置響應內容的格式,可選爲「TEXT/JSON/SCRIPT/JSONP」(可忽略大小寫),默認爲「TEXT」 - 返回值:Promise對象
- 類型:Function - 描述:執行Ajax POST請求,它將返回一個Promise對象用於以鏈式調用的方式來實現異步回調函數 - 參數: - url|String:請求url - args?|String、Object:post提交的數據,此參數傳入String時以「k1=v1&k2=v2」的格式傳入,傳入Object時爲一個數據對象 - callback?|Function:請求成功回調函數,若是傳入此參數則以它爲回調函數執行。它將接收的參數爲響應內容response、響應狀態碼status,響應狀態內容statusText及自定義XHR對象amXHR - dataType?|String:設置響應內容的格式,可選爲「TEXT/JSON/SCRIPT/JSONP」(可忽略大小寫),默認爲「TEXT」 - 返回值:Promise對象
- 類型:Function - 描述:執行Ajax請求,相比於get、post函數,它能夠完成更復雜的請求操做,且此函數可直接在data屬性中傳入帶有上傳文件的form表單元素或FormData對象實現文件上傳操做,當在低版本瀏覽器使用form表單元素上傳時將自動使用隱藏iframe刷新的方式上傳,但在支持FormData對象的瀏覽器中自動使用FormData對象實現文件上傳 - 參數: - options|Object:可選屬性詳情以下: - method?|String:請求類型,GET或POST,大小寫不敏感,默認爲GET - url|String: 請求地址 - data?|String:提交的額外參數,可選爲格式爲k1=v1&k2=v2的字符串、{k1:v1, k2:v2}的數據對象、FormData對象及form表單元素對象,當data爲form對象時,若是也提供了src參數則優先使用src參數當作url進行提交 - async?|Boolean:是否異步請求,默認爲true - cache?|Boolean:請求緩存,若是爲false,則每次都會發送請求,默認爲true - contentType|String:請求參數編碼 - dataType?|String:返回的數據類型,TEXT/JSON/SCRIPT/JSONP,大小寫不敏感,默認爲TEXT - username?|String:服務器認證用戶名 - password?|String:服務器認證密碼 - mimeType?|String:設置mimeType - headers?|Object:額外的請求頭信息,爲一個對象 - timeout?|Number:請求超時時間 - beforeSend?|Function:請求發送前回調,函數參數爲amXHR對象、當前配置對象options - success?|Function:請求成功後回調,函數參數爲data、statusText、amXHR對象 - error?|Function:請求失敗後回調,函數參數爲amXHR對象、statusText - complete?|Function:請求完成後回調,函數參數爲amXHR對象、statusText - abort?|Function:請求中斷後回調,函數參數爲statusText - 返回值:Promise對象
自定義事件對象,支持跨模塊觸發事件
參數:
參數:
參數:
Promise/A+規範 規範實現類,用於以同步的方式去執行回調函數,而不用將回調函數傳入執行函數中,更加符合邏輯,且在須要執行多重回調處理時,以鏈式結構來表示函數處理後的回調。
參數:
參數:
參數:
參數:
繼續學習下一節:【AmapleJS教程】6. 路由配置
也可回顧上一節:【AmapleJS教程】4. 組件