[AngularJS] 使用AngularAMD动态加载Controller

[AngularJS] 使用AngularAMD动态加载Controller

前言

使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularUI Router来提供页面内容切换的功能。但是在UI Router的使用情景里,需要开发人员将每个State所使用的Controller预先加载之后,才能正常的切换页面内容。这也就代表开发人员所建立的SPA,必须要在启动的当下,就先将整个SPA所用到的Controller都预先加载到浏览器之中。而这样的预先加载所有Controller备用的动作,在大型的项目中很容易造成浏览器效能上的负担,进而影响使用者的操作体验。

本篇文章介绍如何使用AngularAMD来动态加载Controller,让SPA的启动过程更加轻量化,用以提升使用者的操作体验。主要为自己留个纪录,也希望能帮助到有需要的开发人员。

前言01

安装

AngularAMD使用bower来发布套件本体与其相依套件。而要使用bower必须要先安装Node.js、接着安装npm、最后安装bower,完成安装步骤之后,开发人员就可以使用bower来下载套件。相关bower的安装步骤,可以参考下列资料:

安装完bower之后,开发人员就可以建立一个新的文件夹作为工作文件夹。接着开启命令提示字符CD到这个工作文件夹之后,输入下列指令,就可以使用bower来取得AngularAMD套件本体与其相依套件。

bower install angularAMD

安装01

而因为后续范例需要使用AngularUI Router这个Angular套件,来提供页面内容切换的功能,所以还需要使用下列指令,使用bower来取得AngularUI Router这个套件。

bower install angular-ui-router

安装02

完成上列步骤后,开启工作文件夹可以看到多出来一个bower_components文件夹,而这个文件夹内摆放了angularAMD套件本体、以及angular、require.js、angular-ui-router这三个套件。

安装03

开发app.js

完成安装步骤后,在工作文件夹内新增一个app.js档案,用来定义系统运行时的相关参数、还有必要的启动程序代码。

开发01

接着需要在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";
        }]; 
    });
    

开发02

开发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>

开发03

执行

完成开发步骤后,就可以准备使用Chrome执行index.html来检视成果。但是在检视成果之前,必须要先参考下列数据开启Chrome的必要功能,后续就使用Chrome来正常的执行index.html。

执行index.html之后,会系统依照路由设定进入预设的Home页面。而使用Chrome的开发者工具,可以看到系统加载了Home页面的Template、Controller,并且显示在页面上。

执行01

点击Home页面的About按钮,会切换到About页面。这时同样从Chrome的开发者工具中,可以看到系统是在点击了About按钮之后,才去加载About页面的Template、Controller来显示在页面上,这也就是AngularAMD所提供的动态加载Controller功能。

执行02

范例下载

范例下载:点此下载

posted @ 2015-08-06 06:09  Clark159  阅读(4665)  评论(2编辑  收藏  举报