篇章一:[AngularJS] 使用AngularAMD動態載入Controller
前言
使用AngularJS來開發Single Page Application(SPA)的時候,可以選用AngularUI Router來提供頁面內容切換的功能。但是在UI Router的使用情景裡,需要開發人員將每個State所使用的Controller預先載入之後,才能正常的切換頁面內容。這也就代表開發人員所建立的SPA,必須要在啟動的當下,就先將整個SPA所用到的Controller都預先載入到瀏覽器之中。而這樣的預先載入所有Controller備用的動作,在大型的專案中很容易造成瀏覽器效能上的負擔,進而影響使用者的操作體驗。
本篇文章介紹如何使用AngularAMD來動態載入Controller,讓SPA的啟動過程更加輕量化,用以提升使用者的操作體驗。主要為自己留個紀錄,也希望能幫助到有需要的開發人員。

安裝
AngularAMD使用bower來發佈套件本體與其相依套件。而要使用bower必須要先安裝Node.js、接著安裝npm、最後安裝bower,完成安裝步驟之後,開發人員就可以使用bower來下載套件。相關bower的安裝步驟,可以參考下列資料:
安裝完bower之後,開發人員就可以建立一個新的資料夾作為工作資料夾。接著開啟命令提示字元CD到這個工作資料夾之後,輸入下列指令,就可以使用bower來取得AngularAMD套件本體與其相依套件。
bower install angularAMD

而因為後續範例需要使用AngularUI Router這個Angular套件,來提供頁面內容切換的功能,所以還需要使用下列指令,使用bower來取得AngularUI Router這個套件。
bower install angular-ui-router

完成上列步驟後,開啟工作資料夾可以看到多出來一個bower_components資料夾,而這個資料夾內擺放了angularAMD套件本體、以及angular、require.js、angular-ui-router這三個套件。

開發app.js
完成安裝步驟後,在工作資料夾內新增一個app.js檔案,用來定義系統運行時的相關參數、還有必要的啟動程式碼。

接著需要在app.js裡面加入require.js的設定參數,用來定義系統運行時使用的套件路徑、以及套件之間的相依性。(相關require.js的使用介紹,可以參考:require.js的用法 - 阮一峰的网络日志)
require.config({
paths: {
// angular
"angular": "bower_components/angular/angular",
// angular-ui
"angular-ui-router": "bower_components/angular-ui-router/release/angular-ui-router",
// angularAMD
"angularAMD": "bower_components/angularAMD/angularAMD",
"ngload": "bower_components/angularAMD//ngload"
},
shim: {
// angular
"angular": { exports: "angular" },
// angular-ui
"angular-ui-router": ["angular"],
// angularAMD
"angularAMD": ["angular"],
"ngload": ["angularAMD"]
}
});
完成require.js設定之後,在同一個app.js裡,加入下列require語法用來載入專案使用的套件。(相關require語法的使用介紹,同樣可以參考:require.js的用法 - 阮一峰的网络日志)
// bootstrap
define(["angular", "angularAMD", "angular-ui-router"], function (angular, angularAMD) {
// ......
});
接著在require語法內,使用下列ui-router+angularAMD語法,來定義系統內ui-router的路由設定、以及預設的開啟路徑。(相關ui-router語法的使用介紹,可以參考:学习 ui-router管理状态 - bubkoo)
// routes
var registerRoutes = function($stateProvider, $urlRouterProvider) {
// default
$urlRouterProvider.otherwise("/home");
// route
$stateProvider
// home
.state("home", angularAMD.route({
url: "/home",
templateUrl: "home.html",
controllerUrl: "home.js"
}))
// home
.state("about", angularAMD.route({
url: "/about",
templateUrl: "about.html",
controllerUrl: "about.js"
}))
;
};
最後,同樣在require語法內,使用下列angular+angularAMD語法,來啟動系統裡的angular套件,這就完成了系統的運行參數、啟動程式碼的相關設定。(相關angular的使用介紹,建議參考:AngularJS 建置與執行 - Shyam Seshadri, Brad Green)
// module
var app = angular.module("app", ["ui.router"]);
// config
app.config(["$stateProvider", "$urlRouterProvider", registerRoutes]);
// bootstrap
return angularAMD.bootstrap(app);
開發Template、Controller
建立定義運行參數與啟動程式碼的app.js之後,就可以著手使用angular+require語法,來建立系統內ui-router所要切換使用的頁面樣板(Template)、以及頁面控制(Controller)。(相關angular的使用介紹,建議參考:AngularJS 建置與執行 - Shyam Seshadri, Brad Green)
home.html
<h1>{{ title }}</h1>
<br/>
<button ui-sref="about">About</button>
home.js
define([], function () { // controller
return ["$scope", function ($scope) { // properties
$scope.title = "This is Home page";
}];
});

開發index.html
完成上列步驟之後,還需要建立index.html來做為整個Single Page Application(SPA)的程式進入點。在這個index.html裡,最主要就是使用requirejs來載入與執行app.js,並且在body裡面加入一個用來讓ui-router擺放頁面內容的div。
<!DOCTYPE html>
<html>
<head>
<!-- meta -->
<meta charset="utf-8">
<!-- title -->
<title></title>
<!-- script -->
<script data-main="app.js" src="bower_components/requirejs/require.js"></script>
</head>
<body>
<!-- content -->
<div ui-view></div>
</body>
</html>

執行
完成開發步驟後,就可以準備使用Chrome執行index.html來檢視成果。但是在檢視成果之前,必須要先參考下列資料開啟Chrome的必要功能,後續就使用Chrome來正常的執行index.html。
執行index.html之後,會系統依照路由設定進入預設的Home頁面。而使用Chrome的開發者工具,可以看到系統加載了Home頁面的Template、Controller,並且顯示在頁面上。

點擊Home頁面的About按鈕,會切換到About頁面。這時同樣從Chrome的開發者工具中,可以看到系統是在點擊了About按鈕之後,才去加載About頁面的Template、Controller來顯示在頁面上,這也就是AngularAMD所提供的動態載入Controller功能。

範例下載
範例下載:點此下載
篇章一:[AngularJS] 使用AngularAMD動態載入Controller的更多相关文章
- 篇章二:[AngularJS] 使用AngularAMD動態載入Service
前言 「使用AngularAMD動態載入Controller」:這篇文章裡介紹如何使用AngularAMD來動態載入Controller.本篇文章以此為基礎,介紹如何使用AngularAMD來動態載入 ...
- 篇章三:[AngularJS] 使用AngularCSS動態載入CSS
前言 使用AngularAMD動態載入Controller 使用AngularAMD動態載入Service 上列兩篇文章裡,介紹了如何如何使用AngularAMD來動態載入Controller與Ser ...
- [Xamarin] 動態載入Fragment (转帖)
這篇我們來動態加入,一樣務求好懂簡單 1.一樣先將專案調整成3.0以上版本 2.首先建立自定Control的Layout \Resources\Layout\MyControlLayout1.axml ...
- Jquery easy ui datagrid動態加載列問題
1.如下图效果是当选择不同的日期范围时datagrid则会加载出对应的列数
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)
說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)
說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)
JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...
- 小林的VB6動態壁紙模擬程序
本項目參考了以下資料[這可能對你理解程序運行有幫助]: https://github.com/Yinmany/WinWallpaper https://blog.csdn.net/breaksoftw ...
- [AngularJS] 使用AngularAMD动态加载Service
[AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...
随机推荐
- cl编译C文件的环境变量修改
添 加环境 变量INCLUDEC:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;C:\Program Files (x8 ...
- Code+ A 晨跑【三个数的最小公倍数】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言524288K64bit IO Format: %lld 题目描述 “无体育,不清华”.“每天锻炼一小时,健康工作 ...
- 浅谈如何做好Bug回归验证?
作为测试人员,我们都知道Bug的生命周期是: 我们都希望自己不仅有敏锐的洞察力能够全面的找出隐藏在软件中的bug,还希望自己有系统的分析能力能够准确的分析出每个bug的原因以至于能正确.全面的解决修复 ...
- vue编程中,需要注意的
同名情况: data() 中的数据名 和 methods() 中的方法名 不能相同. 原因:因为在vue中这两个都能用this.XX拿出来,如果写一样的,将不能分辨,计算机会默认覆盖一个. ...
- Vue之$set使用
背景 后端参与前端开发的小白,在开发过程中遇到了如下情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. ...
- Java 继承问题 -- 子类是否继承父类的私有属性
理解一: 子类会继承父类的所有属性和方法,至于能不能直接访问,那就是访问权限的问题了. 例如:父类有个private String name; 属性.子类会继承下来,但子类访问不了,因为是privat ...
- docker 常用 命令
http://os.51cto.com/art/201409/451117.htm 2.1 在测试机启动容器,安装ssh docker run -i -t ubuntu /bin/bash #此方式运 ...
- 一个人的安全部之ELK接收Paloalto日志并用钉钉告警
起因 通报漏洞后,开发未能及时修复漏洞,导致被攻击,领导说我发现被攻击的时间晚了,由于一个人安全部精力有限未能及时看IPS告警,于是做了个钉钉告警. 本人环境介绍 ubuntu 14.04 pytho ...
- django发送邮箱
要用django发送邮箱之前需要在setting中配置一下 EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 25 EMAIL_HOST_USER = 'xxx@qq.c ...
- ASP.NET MVC学习---(八)三个比较常用的方便的功能
通过之前的了解 现在我们已经可以使用mvc进行一些简单的开发 但是还不够 哪里不够呢? 为什么现在的程序员喜欢用mvc进行开发 不就是因为它爽吗? 之前介绍的那些特点仅仅是mvc框架的一小部分 只是一 ...