前言

使用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的更多相关文章

  1. 篇章二:[AngularJS] 使用AngularAMD動態載入Service

    前言 「使用AngularAMD動態載入Controller」:這篇文章裡介紹如何使用AngularAMD來動態載入Controller.本篇文章以此為基礎,介紹如何使用AngularAMD來動態載入 ...

  2. 篇章三:[AngularJS] 使用AngularCSS動態載入CSS

    前言 使用AngularAMD動態載入Controller 使用AngularAMD動態載入Service 上列兩篇文章裡,介紹了如何如何使用AngularAMD來動態載入Controller與Ser ...

  3. [Xamarin] 動態載入Fragment (转帖)

    這篇我們來動態加入,一樣務求好懂簡單 1.一樣先將專案調整成3.0以上版本 2.首先建立自定Control的Layout \Resources\Layout\MyControlLayout1.axml ...

  4. Jquery easy ui datagrid動態加載列問題

    1.如下图效果是当选择不同的日期范围时datagrid则会加载出对应的列数

  5. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)

    說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...

  6. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)

    說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...

  7. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)

    JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...

  8. 小林的VB6動態壁紙模擬程序

    本項目參考了以下資料[這可能對你理解程序運行有幫助]: https://github.com/Yinmany/WinWallpaper https://blog.csdn.net/breaksoftw ...

  9. [AngularJS] 使用AngularAMD动态加载Service

    [AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...

随机推荐

  1. HDU 6235.Permutation (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  2. Codeforces 832 B. Petya and Exam-字符串匹配

    补的若干年以前的题目,水题,太菜啦_(:з」∠)_    B. Petya and Exam   time limit per test 2 seconds memory limit per test ...

  3. 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...

  4. TaobaoVM

    作者:Andoter链接:https://www.zhihu.com/question/275665265/answer/416021488来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商 ...

  5. (转)stage 3d or unity 3d

    这个是这样子的.stage3d如果不使用flascc的话,性能会卡在as上面.你没卡是因为你用的效果还不够高级.往深了走的高端应用就是卡as性能上.这不是你代码能优化了的.我们后来都改用flascc写 ...

  6. 代理模式(Proxy)--动态代理(CGLIB)

    上一篇:代理模式(Proxy)--动态代理(jdk) (1)CGLIB技术是第三方代理技术,可以对任何类生成代理,代理的原则是对目标对象进行继承代理 (2)如果目标对象被final修饰,则无法被CGL ...

  7. MySQL 中的 base64 函数

    1. 5.6版本及之后的版本的base64 主要就是两个mysql内部函数to_base64和from_base64,使用也很简单,如下: 5.6之前不支持 mysql> select vers ...

  8. Windows路由表配置:双网卡路由分流

    一.windows 路由表解释 route print - ====================================================================== ...

  9. vue中自定义指令vue.direvtive,自定义过滤器vue.filter(),vue过渡transition

    自定义指令 默认设置的核心指令( v-model,v-bind,v-for,v-if,v-on等 ),Vue 也允许注册自定义指令.注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而 ...

  10. select自己定义属性值

    select自己定义属性值 1.问题背景 下拉框能够传递值和内容,只是有时为了传值,还须要连带其它的值也一起传过来.假设用title属性.鼠标移到下拉框上方会显示出来,这样就会导致被暴露出来.所以,为 ...