zoukankan      html  css  js  c++  java
  • [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

    范例下载

    范例下载:点此下载

  • 相关阅读:
    快速排序理论---不含源码
    归并排序理论---不含源码
    希尔排序(shell)理论---不含源码
    Visual C++中error spawning cl.exe解决办法
    数据库的基础知识点---1
    冒泡排序的基础知识部分(不含源码)
    在虚拟机的Linux系统下安装wineqq
    数据变量的别名
    void*和void类型
    变量的作用域和连接性
  • 原文地址:https://www.cnblogs.com/clark159/p/4706319.html
Copyright © 2011-2022 走看看