欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AngularJs动态加载模块和依赖注入详解

程序员文章站 2022-05-30 20:58:04
废话不多说,进入正题... 首先我们看下文件结构: angular-oclazyload --- demo文件夹 scripts...

废话不多说,进入正题...

首先我们看下文件结构:

angular-oclazyload           --- demo文件夹
  scripts               --- 框架及插件文件夹
    angular-1.4.7          --- angular 不解释
    angular-ui-router        --- uirouter 不解释
    oclazyload           --- oclazyload 不解释
    bootstrap            --- bootstrap 不解释
    angular-tree-control-master   --- angular-tree-control-master 不解释
    ng-table            --- ng-table 不解释
    angular-bootstrap        --- angular-bootstrap 不解释
  js                 --- js文件夹 针对demo写的js文件
    controllers           --- 页面控制器文件夹
      angular-tree-control.js   --- angular-tree-control控制器代码
      default.js         --- default控制器代码
      ng-table.js         --- ng-table控制器代码
    app.config.js          --- 模块注册及配置代码
    oclazyload.config.js      --- 加载模块配置代码
    route.config.js         --- 路由配置及加载代码
  views                --- html页面文件夹
    angular-tree-control.html    --- angular-tree-control插件的效果页面
    default.html          --- default页面
    ng-table.html          --- ng-table插件效果页面
    ui-bootstrap.html        --- uibootstrap插件效果页面
  index.html             --- 主页面

注意:这个demo没做嵌套路由,只是简单实现单视图的路由以展示效果。

我们来看主页面的代码:

<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <link rel="stylesheet" href="scripts/bootstrap/dist/css/bootstrap.min.css" />
  <script src="scripts/angular-1.4.7/angular.js"></script>
  <script src="scripts/angular-ui-router/release/angular-ui-router.min.js"></script>
  <script src="scripts/oclazyload/dist/oclazyload.min.js"></script>
  <script src="js/app.config.js"></script>
  <script src="js/oclazyload.config.js"></script>
  <script src="js/route.config.js"></script>
</head>
<body>
<div ng-app="templateapp">
  <div>
    <a href="#/default">主页</a>
    <a href="#/uibootstrap" >ui-bootstrap</a>
    <a href="#/ngtable">ng-table</a>
    <a href="#/ngtree">angular-tree-control</a>
  </div>
  <div ui-view></div>
</div>
</body>
</html>

在这个页面,我们只加载了bootstrap的css、angular的js、ui-router的js、oclazyload的js,以及3个配置的js文件。
再看看四个页面的html代码:

angular-tree-control效果页面

<treecontrol tree-model="ngtree.treedata" class="tree-classic ng-cloak" options="ngtree.treeoptions">
  {{node.title}}
</treecontrol>

页面上有个使用该插件对应的指令。

default页面

<div class="ng-cloak">
  {{default.value}}
</div>

这里我们只是用来证明加载并正确执行default.js。

ng-table效果页面

<div class="ng-cloak">
  <div class="p-h-md p-v bg-white box-shadow pos-rlt">
    <h3 class="no-margin">ng-table</h3>
  </div>
  <button ng-click="ngtable.tableparams.sorting({})" class="btn btn-default pull-right">clear sorting</button>
  <p>
    <strong>sorting:</strong> {{ngtable.tableparams.sorting()|json}}
  </p>
  <table ng-table="ngtable.tableparams" class="table table-bordered table-striped">
    <tr ng-repeat="user in $data">
      <td data-title="'name'" sortable="'name'">
        {{user.name}}
      </td>
      <td data-title="'age'" sortable="'age'">
        {{user.age}}
      </td>
    </tr>
  </table>
</div>

这里写了些简单的ng-table效果。

ui-bootstrap效果页面

<span uib-dropdown class="ng-cloak">
  <a href id="simple-dropdown" uib-dropdown-toggle>
    下拉框触发
  </a>
  <ul class="uib-dropdown-menu dropdown-menu" aria-labelledby="simple-dropdown">
    下拉框内容.这里写个效果证明实现动态加载即可
  </ul>
</span>

这里仅写了个下拉框效果,证明正确加载并使用该插件。
好了,看完了html,我们看下加载配置和路由配置:

"use strict"
var tempapp = angular.module("templateapp",["ui.router","oc.lazyload"])
.config(["$provide","$compileprovider","$controllerprovider","$filterprovider",
        function($provide,$compileprovider,$controllerprovider,$filterprovider){
          tempapp.controller = $controllerprovider.register;
          tempapp.directive = $compileprovider.register;
          tempapp.filter = $filterprovider.register;
          tempapp.factory = $provide.factory;
          tempapp.service =$provide.service;
          tempapp.constant = $provide.constant;
        }]);

以上代码对模块的注册,仅仅依赖了ui.router和oc.lazyload。配置也只是简单配置了模块,以便在后面的js能识别到tempapp上的方法。
然后我们再看看oclazyload加载模块的配置:

"use strict"
tempapp
.constant("modules_config",[
  {
    name:"ngtable",
    module:true,
    files:[
      "scripts/ng-table/dist/ng-table.min.css",
      "scripts/ng-table/dist/ng-table.min.js"
    ]
  },
  {
    name:"ui.bootstrap",
    module:true,
    files:[
      "scripts/angular-bootstrap/ui-bootstrap-tpls-0.14.3.min.js"
    ]
  },
  {
    name:"treecontrol",
    module:true,
    files:[
      "scripts/angular-tree-control-master/css/tree-control.css",
      "scripts/angular-tree-control-master/css/tree-control-attribute.css",
      "scripts/angular-tree-control-master/angular-tree-control.js"
    ]
  }
])
.config(["$oclazyloadprovider","modules_config",routefn]);
function routefn($oclazyloadprovider,modules_config){
  $oclazyloadprovider.config({
    debug:false,
    events:false,
    modules:modules_config
  });
};

路由的配置:

"use strict"
tempapp.config(["$stateprovider","$urlrouterprovider","$locationprovider",routefn]);
function routefn($stateprovider,$urlrouterprovider,$locationprovider){
  $urlrouterprovider.otherwise("/default");
  $stateprovider
  .state("default",{
    url:"/default",
    views:{
      "":{
        templateurl:"views/default.html",
        controller:"defaultctrl",
        controlleras:"default"
      }
    },
    resolve:{
      deps:["$oclazyload",function($oclazyload){
        return $oclazyload.load("js/controllers/default.js");
      }]
    }
  })
  .state("uibootstrap",{
    url:"/uibootstrap",
    views:{
      "":{
        templateurl:"views/ui-bootstrap.html"
      }
    },
    resolve:{
      deps:["$oclazyload",function($oclazyload){
        return $oclazyload.load("ui.bootstrap");
      }]
    }
  })
  .state("ngtable",{
    url:"/ngtable",
    views:{
      "":{
        templateurl:"views/ng-table.html",
        controller:"ngtablectrl",
        controlleras:"ngtable"
      }
    },
    resolve:{
      deps:["$oclazyload",function($oclazyload){
        return $oclazyload.load("ngtable").then(
          function(){
            return $oclazyload.load("js/controllers/ng-table.js");
          }
        );
      }]
    }
  })
  .state("ngtree",{
    url:"/ngtree",
    views:{
      "":{
        templateurl:"views/angular-tree-control.html",
        controller:"ngtreectrl",
        controlleras:"ngtree"
      }
    },
    resolve:{
      deps:["$oclazyload",function($oclazyload){
        return $oclazyload.load("treecontrol").then(
          function(){
            return $oclazyload.load("js/controllers/angular-tree-control.js");
          }
        );
      }]
    }
  })
};

ui-bootstrap的下拉框简单的实现不需要控制器,那么我们就只看看ng-table和angular-tree-control的控制器js吧:

ng-table.js

(function(){
"use strict"
tempapp
.controller("ngtablectrl",["$location","ngtableparams","$filter",ngtablectrlfn]);
function ngtablectrlfn($location,ngtableparams,$filter){
  var vm = this;
  //数据
  var data = [{ name: "moroni", age: 50 },
         { name: "tiancum ", age: 43 },
         { name: "jacob", age: 27 },
         { name: "nephi", age: 29 },
         { name: "enos", age: 34 },
         { name: "tiancum", age: 43 },
         { name: "jacob", age: 27 },
         { name: "nephi", age: 29 },
         { name: "enos", age: 34 },
         { name: "tiancum", age: 43 },
         { name: "jacob", age: 27 },
         { name: "nephi", age: 29 },
         { name: "enos", age: 34 },
         { name: "tiancum", age: 43 },
         { name: "jacob", age: 27 },
         { name: "nephi", age: 29 },
         { name: "enos", age: 34 }];
  vm.tableparams = new ngtableparams(  // 合并默认的配置和url参数
    angular.extend({
      page: 1,      // 第一页
      count: 10,     // 每页的数据量
      sorting: {
        name: 'asc'   // 默认排序
      }
    },
    $location.search())
    ,{
      total: data.length, // 数据总数
      getdata: function ($defer, params) {
        $location.search(params.url()); // 将参数放到url上,实现刷新页面不会跳回第一页和默认配置
        var ordereddata = params.sorting ?
            $filter('orderby')(data, params.orderby()) :data;
        $defer.resolve(ordereddata.slice((params.page() - 1) * params.count(), params.page() * params.count()));
      }
    }
  );
};
})();

angular-tree-control.js

(function(){
"use strict"
tempapp
.controller("ngtreectrl",ngtreectrlfn);
function ngtreectrlfn(){
  var vm = this;
  //树数据
  vm.treedata = [
        {
          id:"1",
          title:"标签1",
          childlist:[
            {
              id:"1-1",
              title:"子级1",
              childlist:[
                {
                  id:"1-1-1",
                  title:"再子级1",
                  childlist:[]
                }
              ]
            },
            {
              id:"1-2",
              title:"子级2",
              childlist:[
                {
                  id:"1-2-1",
                  title:"再子级2",
                  childlist:[
                    {
                      id:"1-2-1-1",
                      title:"再再子级1",
                      childlist:[]
                    }
                  ]
                }
              ]
            },
            {
              id:"1-3",
              title:"子级3",
              childlist:[]
            }
          ]
        },
        {
          id:"2",
          title:"标签2",
          childlist:[
            {
              id:"2-1",
              title:"子级1",
              childlist:[]
            },
            {
              id:"2-2",
              title:"子级2",
              childlist:[]
            },
            {
              id:"2-3",
              title:"子级3",
              childlist:[]
            }
          ]}
        ,
        {
          id:"3",
          title:"标签3",
          childlist:[
            {
              id:"3-1",
              title:"子级1",
              childlist:[]
            },
            {
              id:"3-2",
              title:"子级2",
              childlist:[]
            },
            {
              id:"3-3",
              title:"子级3",
              childlist:[]
            }
          ]
        }
      ];
  //树配置
  vm.treeoptions = {
   nodechildren:"childlist",
    dirselectable:false
  };
};
})();

让我们忽略default.js吧,毕竟里面只有个"hello wrold"。

以上就是本文的全部内容,希望对大家的学习有所帮助。