摘要:最近一段時(shí)間在學(xué)習(xí),由于覺得直接使用它需要加載很多的文件,因此想使用來實(shí)現(xiàn)異步加載,并動態(tài)注入控制器。手動啟動,特別說明此處的不是那個(gè)框架,而是的一個(gè)手動啟動框架的函數(shù)中完成了各模塊的初始化,并且引入了。
最近一段時(shí)間在學(xué)習(xí)angularjs,由于覺得直接使用它需要加載很多的js文件,因此想使用requirejs來實(shí)現(xiàn)異步加載,并動態(tài)注入控制器。簡單搜索了下發(fā)現(xiàn)好多教程寫的都很復(fù)雜,所以打算寫一下我的方法,算是學(xué)習(xí)筆記了。
demo目錄如下圖:
index.html文件的內(nèi)容:
demo
在引入main.js后,就需要在其中完成requirejs的初始化:
// main.js "use strict"; (function (win) { require.config({ baseUrl: "./", // 依賴相對路徑 paths: { "angular": "libs/angular.min", "angular-route": "libs/angular-route.min" }, // 引入沒有使用requirejs模塊寫法的類庫 shim: { "angular": { exports: "angular" }, "angular-route": { // angular-route依賴angular deps: ["angular"], exports: "ngRoute" } } }); // 自動導(dǎo)入router.js模塊,由于后綴名可以省略,故寫作"router", // 并將模塊返回的結(jié)果賦予到router中。 require(["angular","router"], function(angular,router){ // 手動啟動angularjs,特別說明此處的bootstrap不是那個(gè)ui框架, // 而是angularjs的一個(gè)手動啟動框架的函數(shù) angular.bootstrap(document, ["blogApp"]); }); })(window);
main.js中完成了各模塊的初始化,并且引入了router.js。
下面我們在router.js中配置路由:
// router.js define(["angular", "require", "angular-route"], function (angular, require) { var blogApp = angular.module("blogApp",["ngRoute"]); blogApp.config(["$routeProvider","$controllerProvider", function($routeProvider,$controllerProvider) { $routeProvider .when("/", { templateUrl:"templates/list.html", controller: "ListCtrl", resolve:{ delay : ctrlRegister("ListCtrl",["controllers/ListCtrl.js"]) } }) .when("/data", { templateUrl:"templates/data.html", controller: "DataCtrl", resolve:{ delay : ctrlRegister("DataCtrl",["controllers/DataCtrl.js"]) } }) .otherwise({ redirectTo: "/" }); function ctrlRegister (ctrlName, ctrlModule) { return function ($q) { var defer = $q.defer(); require(ctrlModule, function (controller) { $controllerProvider.register(ctrlName, controller); defer.resolve(); }); return defer.promise; } } } ]); return blogApp; });
我把這里面拆為分三個(gè)部分來說
第一部分:定義該模塊
// 引入3個(gè)基礎(chǔ)模塊 define(["angular", "require", "angular-route"], function (angular, require) { // 定義整個(gè)demo為一個(gè)名為blogApp的模塊 var blogApp = angular.module("blogApp",["ngRoute"]); // ...第二部分:路由配置... // ...第三部分:復(fù)用的動態(tài)注入控制器函數(shù) // 向main.js返回這個(gè)blogApp return blogApp; });
第二部分:設(shè)置基礎(chǔ)路由
blogApp.config(["$routeProvider","$controllerProvider", function($routeProvider,$controllerProvider) { $routeProvider .when("/", { // 模板地址 templateUrl:"templates/list.html", // 控制器的名字 controller: "ListCtrl", // resolve用來在完成路由前處理一些事 // 這里用來動態(tài)加載并注入相應(yīng)的控制器 resolve:{ // ctrlRegister為我自己寫的一個(gè)復(fù)用的函數(shù), // 用于注入控制器。見第三部分 delay : ctrlRegister("ListCtrl",["controllers/ListCtrl.js"]) } }); } }
第三部分:復(fù)用的控制器注入函數(shù)
// 該函數(shù)接受兩個(gè)參數(shù) // ctrlName,字符串類型,為該控制器的名字 // ctrlModule,字符串?dāng)?shù)組類型,為要引入的控制器的相對地址 // 調(diào)用例如 ctrlRegister("ListCtrl",["controllers/ListCtrl.js"]) function ctrlRegister (ctrlName, ctrlModule) { return function ($q) { var defer = $q.defer(); // 加載該控制器,并將返回值賦給controller,返回值一般是一個(gè)控制器函數(shù) require(ctrlModule, function (controller) { // 將返回值注冊為名稱為ctrlName的控制器 $controllerProvider.register(ctrlName, controller); defer.resolve(); }); // 完成注冊 return defer.promise; } }
好了,這樣就完成了動態(tài)加載的功能了,下面就可以寫要動態(tài)加載的控制器了
用其中一個(gè)控制器ListCtrl.js來說明問題:
// ListCtrl.js // 加載angular模塊 define(["angular"], function (angular) { 將本控制器函數(shù)作為結(jié)果返回給router.js return function ListCtrl( $scope ){ $scope.lists = ["1","2","3"]; }; });
剩下的事情就是在list.html中接收控制器傳送的數(shù)據(jù)了:
最終實(shí)現(xiàn)的功能是:
比如我訪問http://127.0.0.1/demo/#/只會加載list.html和ListCtrl.js;
而當(dāng)訪問http://127.0.0.1/demo/#/data就只會加載data.html和DataCtrl.js。
這樣做有什么好處呢?當(dāng)有很多控制器時(shí),可以按需加載相應(yīng)的控制器,不會一股腦全部加載上來(看起來依然并沒有什么卵用)。
很慚愧,只為大家節(jié)約了一點(diǎn)微小的帶寬,謝謝大家。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79208.html
摘要:首先,我們需要在入口頁面的中配置根路徑然后創(chuàng)建一個(gè)路由模塊路由配置在主模塊中導(dǎo)入配置好的路由模塊而在頁面中需要一個(gè)容器去承載上面代碼中的定義了用戶點(diǎn)擊后的路由跳轉(zhuǎn),定義該路由激活時(shí)的樣式類。 剛實(shí)習(xí)的時(shí)候用過AngularJS,那時(shí)候真的是連原生JavaScript都不會寫,依樣畫葫蘆做了幾個(gè)管理后臺。然后突然換項(xiàng)目了,AngularJS就不寫了,感覺前前后后接觸了一年多的Angula...
摘要:如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點(diǎn)加載會阻塞頁面加載默認(rèn)異步加載文件方法一把放到頁面底部加載方法二支持定義全局相對路徑方法一自定義屬性指定網(wǎng)頁程序的主模塊文件定義整個(gè)網(wǎng)頁代碼的入口文件的相對位置,以后此文件 如果有疑惑的地方,歡迎討論,我是初學(xué),希望能切磋和得到指點(diǎn); js加載會阻塞頁面加載: //requirejs默認(rèn)異步加載js文件; 方法一...
摘要:特意對前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會不定期更...
摘要:他僅需簡單地通過一個(gè)標(biāo)簽發(fā)起請求,是實(shí)現(xiàn)跨域服務(wù)調(diào)用一種公認(rèn)手段。為了在中使用服務(wù),須要將參數(shù)的值指定為。該示例中,的參數(shù)為,因此告訴將響應(yīng)包裹到一個(gè)中 加載JavaScript文件 RequireJS的目的是鼓勵(lì)代碼的模塊化,它使用了不同于傳統(tǒng)script標(biāo)簽的腳本加載步驟。可以用它來加速、優(yōu)化代碼,但其主要目的還是為了代碼的模塊化。它鼓勵(lì)在使用腳本時(shí)以module ID替代URL地...
摘要:引言指令可以說是的核心,而其開發(fā)也是比較困難的,本文主要介紹指令的一些參數(shù)和的綁定策略。指令執(zhí)行的優(yōu)先級,用于多個(gè)指令同時(shí)作用于同一個(gè)元素時(shí)。改變父會影響指令,而改變指令不會影響父。在父和指令之間建立雙向綁定。 引言 指令(Directive)可以說是 AngularJS 的核心,而其開發(fā)也是比較困難的,本文主要介紹指令的一些參數(shù)和scope的綁定策略。 參數(shù) 從 AngularJS ...
閱讀 2499·2021-08-11 11:16
閱讀 2940·2019-08-30 15:55
閱讀 3341·2019-08-30 12:53
閱讀 1580·2019-08-29 13:28
閱讀 3272·2019-08-28 18:17
閱讀 947·2019-08-26 12:19
閱讀 2475·2019-08-23 18:27
閱讀 714·2019-08-23 18:17