摘要:異步加載各個(gè)組件就很有必要。在這里我就以為框架來進(jìn)行異步加載說明。而為了將服務(wù)進(jìn)行異步加載我們不能用普通的或者。而需要調(diào)用或者如果采用進(jìn)行編譯打包的話就需要的支持,這樣可以對進(jìn)行拆分打包,達(dá)到異步加載的目的。
ui-route相比于angularjs的原生視圖路由更好地支持了路由嵌套,狀態(tài)轉(zhuǎn)移等等。隨著視圖不斷增加,打包的js體積也會(huì)越來越大,比如我在應(yīng)用里面用到了wangeditor里面多帶帶依賴的jquery就300多k。異步加載各個(gè)組件就很有必要。在這里我就以ui-route為框架來進(jìn)行異步加載說明。
首先看一下路由加載文件
angular.module("webtrn-sns").config(["$stateProvider", function ($stateProvider) { $stateProvider.state({ name: "home.message", url: "/message", abstract: true, templateProvider: ["resources", function (resources) { return resources.template }], controllerProvider: ["resources", (resources)=> { return resources.controller }], onEnter: ["resources", (resources)=>resources.css.use()], onExit: ["resources", (resources)=>resources.css.unuse()], resolve: { resources: ()=> { return new Promise( resolve => { require([], () => { resolve({ css: require("./css/message_box.css"), template: require("./html/message_box.html"), controller: require("./js/message_box.js") }) }) } ); } } } ).state({ name: "home.message.add_message", url: "/add_message?isReply&toUid&title", params: {isReply: null, toUid: null, title: null}, templateProvider: ["resources", function (resources) { return resources.template }], controllerProvider: ["resources", (resources)=> { return resources.controller }], onEnter: ["resources", (resources)=>resources.css.use()], onExit: ["resources", (resources)=>resources.css.unuse()], resolve: { resources: ()=> { return new Promise( resolve => { require(["./js/message.js"], () => { resolve({ css: require("./css/add_message.css"), template: require("./html/add_message.html"), controller: require("./js/add_message.js") }) }) } ); } } } ) }])
這個(gè)是路由狀態(tài)的一個(gè)聲明文件,name,url,param字段的方式不變,關(guān)鍵是看resolve這個(gè)部分。根據(jù)ui-route的resolve文檔,resolve是為了給state或者controller進(jìn)行自定義注入對象的。
下面是舉出文檔中關(guān)于resolve的例子:
$stateProvider.state("myState", { resolve:{ // Example using function with simple return value. // Since it"s not a promise, it resolves immediately. simpleObj: function(){ return {value: "simple!"}; }, // Example using function with returned promise. // This is the typical use case of resolve. // You need to inject any services that you are // using, e.g. $http in this example promiseObj: function($http){ // $http returns a promise for the url data return $http({method: "GET", url: "/someUrl"}); }, // Another promise example. If you need to do some // processing of the result, use .then, and your // promise is chained in for free. This is another // typical use case of resolve. promiseObj2: function($http){ return $http({method: "GET", url: "/someUrl"}) .then (function (data) { return doSomeStuffFirst(data); }); }, // Example using a service by name as string. // This would look for a "translations" service // within the module and return it. // Note: The service could return a promise and // it would work just like the example above translations: "translations", // Example showing injection of service into // resolve function. Service then returns a // promise. Tip: Inject $stateParams to get // access to url parameters. translations2: function(translations, $stateParams){ // Assume that getLang is a service method // that uses $http to fetch some translations. // Also assume our url was "/:lang/home". return translations.getLang($stateParams.lang); }, // Example showing returning of custom made promise greeting: function($q, $timeout){ var deferred = $q.defer(); $timeout(function() { deferred.resolve("Hello!"); }, 1000); return deferred.promise; } }, // The controller waits for every one of the above items to be // completely resolved before instantiation. For example, the // controller will not instantiate until promiseObj"s promise has // been resolved. Then those objects are injected into the controller // and available for use. controller: function($scope, simpleObj, promiseObj, promiseObj2, translations, translations2, greeting){ $scope.simple = simpleObj.value; // You can be sure that promiseObj is ready to use! $scope.items = promiseObj.data.items; $scope.items = promiseObj2.items; $scope.title = translations.getLang("english").title; $scope.title = translations2.title; $scope.greeting = greeting; } })
我們可以看到resolve的對象是支持Promise的。
再回到我們之前的代碼templateProvider和controllerProvider我們注入了resources的模板對象和controller對象,onEnter和onExit注入了css模塊。
如果controller中依賴了服務(wù)怎么辦的?
resolve: { resources: ()=> { return new Promise( resolve => { require(["./js/message.js"], () => { resolve({ css: require("./css/add_message.css"), template: require("./html/add_message.html"), controller: require("./js/add_message.js") }) }) } ); } }
可以在require里面將服務(wù)注入,如代碼中的message.js。而為了將服務(wù)進(jìn)行異步加載我們不能用普通的.factory或者.service。而需要調(diào)用$provide.factory或者$provide.service
如果采用webpack進(jìn)行編譯打包的話就需要webpack.optimize.CommonsChunkPlugin的支持,這樣可以對js進(jìn)行拆分打包,達(dá)到異步加載js的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80777.html
摘要:關(guān)于應(yīng)用程序的行為類似于狀態(tài)機(jī)。將應(yīng)用程序的每個(gè)功能視為一組狀態(tài)。當(dāng)嵌套狀態(tài)處于活動(dòng)狀態(tài)時(shí),該片段將附加到瀏覽器中父狀態(tài)的。父狀態(tài)可用于限制對整個(gè)子狀態(tài)樹的訪問,但本身不提供任何。如果方案返回,則轉(zhuǎn)換將暫停,直到解決狀態(tài)頂級狀態(tài)嵌套狀態(tài) 關(guān)于state UI-Router應(yīng)用程序的行為類似于狀態(tài)機(jī)。 將應(yīng)用程序的每個(gè)功能視為一組狀態(tài)。一次只能有一個(gè)狀態(tài)為活動(dòng)狀態(tài)。用戶可以從一種狀態(tài)轉(zhuǎn)換...
摘要:集移動(dòng)應(yīng)用與框架與一身的框架利用我們可以輕易制造出一款帶有原生應(yīng)用與體驗(yàn)的移動(dòng)這次我們就搭建一個(gè)圖書還能聽歌看電影實(shí)現(xiàn)了一些基本的功能,搜索圖書類型,查看圖書詳情,搜索圖書標(biāo)簽,查看圖書筆記等。前端交互采用了與綁定的。 ionic : 集移動(dòng)應(yīng)用UI與 angularjs 框架與一身的 Hybrid App 框架 利用 ionic 我們可以輕易制造出一款帶有原生應(yīng)用UI與體驗(yàn)的移動(dòng)A...
摘要:回調(diào)說白了,就是把函數(shù)當(dāng)參數(shù)傳給另一根函數(shù),在另一個(gè)函數(shù)執(zhí)行時(shí)調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個(gè)函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網(wǎng)上的一些博客和例子,大都以定時(shí)任務(wù)為例子說明,但具體的原理我還是不太 回調(diào) 說白了,就是把函數(shù)當(dāng)參數(shù)傳給另一根函數(shù),在另一個(gè)函數(shù)執(zhí)行時(shí)調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個(gè)函數(shù)success和error,下...
摘要:回調(diào)說白了,就是把函數(shù)當(dāng)參數(shù)傳給另一根函數(shù),在另一個(gè)函數(shù)執(zhí)行時(shí)調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個(gè)函數(shù)和,下面的方法請求成功執(zhí)行,失敗執(zhí)行異步異步的原理我看了網(wǎng)上的一些博客和例子,大都以定時(shí)任務(wù)為例子說明,但具體的原理我還是不太 回調(diào) 說白了,就是把函數(shù)當(dāng)參數(shù)傳給另一根函數(shù),在另一個(gè)函數(shù)執(zhí)行時(shí)調(diào)用此函數(shù)例如,在下面這段代碼中,上面定義了兩個(gè)函數(shù)success和error,下...
摘要:被認(rèn)為是為開發(fā)者提供的最實(shí)用的一個(gè)模塊。與集成的服務(wù)不同的是,可以將視圖嵌套,因?yàn)樗诘氖遣僮鳡顟B(tài)而僅非。與傳統(tǒng)做法使用不同的是,在里需要使用服務(wù)。當(dāng)在中處理路由和狀態(tài)時(shí),開發(fā)者的重心是當(dāng)前的狀態(tài)是什么以及在哪一個(gè)頁面里。 初學(xué)angularjs,第一個(gè)實(shí)例是官網(wǎng)的phoneCat,里面路由用的是ngRoute,后來看到別的用ui-router,覺得好奇,ui-route是什么呢?百...
閱讀 3729·2021-11-24 09:39
閱讀 2610·2019-08-30 15:54
閱讀 1149·2019-08-30 13:01
閱讀 3429·2019-08-28 18:30
閱讀 1623·2019-08-26 17:44
閱讀 3591·2019-08-26 11:31
閱讀 2413·2019-08-26 10:40
閱讀 1239·2019-08-26 10:27