[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功能。
范例下载
范例下载:点此下载