篇章一:[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 ...
随机推荐
- CF987A Infinity Gauntlet【STL】
[链接]:CF987A [分析]:运用map [代码]: #include <iostream> #include<queue> #include<string.h> ...
- Codeforces Round #262 (Div. 2) A. Vasya and Socks【暴力/模拟/袜子在可以在合法情况下增加后用几天】
A. Vasya and Socks time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Spring Cloud 微服务架构解决方案
1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...
- 每天一个Linux命令(10)cp命令
cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文 ...
- JSON 中的 key
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...
- 八. 输入输出(IO)操作3.面向字符的输出流
面向字符的输出流都是类 Writer 的子类,其类层次结构如图 10-5 所示. 图10-5 Writer的类层次结构图 表 10-3 列出了 Writer 的主要子类及说明. 表 10-3 Writ ...
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
查了N久资料,包括MSDN的官方文档,对于同一工作组下,不同机器之间如何利用Private Queue(专用队列)来发送/接收消息,关于Path的引用一说,无非都是MachineName\privat ...
- iOS网络编程--ASIHTTPRequest框架安装和配置-图文解说
ASIHTTPRequest框架是优秀的第三方Objective-C的HTTP框架,支持Mac OS X和iOS下的HTTP开发.技术支持网站是http://allseeing-i.com/ASIHT ...
- Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTML特性(attribu ...
- 决定干点事儿--翻译一下《effective modern c++》
写了非常多关于C++11的博客.总是认为不踏实,非常多东西都是东拼西凑.市场上也非常少有C++11的优秀书籍,但幸运的是Meyers老爷子并没有闲赋.为我们带来了<effective moder ...