English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Carga dinámica de módulos y dependencias en AngularJs

El proyecto últimamente está muy ocupado, tengo que trabajar durante el día y preparar las presentaciones de puntos de conocimiento de Angular para los colegas por la noche, después de todo, es el final del año y me voy a dar de baja, el desarrollo posterior del proyecto aún necesita alguien para tomar el mando, por lo que ocupé el tiempo de estudio nocturno. Originalmente no tenía la intención de escribir estas notas de aprendizaje de plugins de terceros, pero creo que es útil cargar módulos a pedido y usarlo con éxito, por lo que lo registramos. Dado que no he utilizado mucho requireJs, no sé cuál es la diferencia entre esto y requireJs, ni puedo explicar claramente si esto realmente es una carga a pedido de Angular.

Para lograr el efecto de los puntos de conocimiento de esta nota de aprendizaje, necesitamos usar:

angular:https://github.com/angular/angular.js

ui-router:https://github.com/angular-ui/ui-router

ocLazyLoad:https://github.com/ocombe/ocLazyLoad

No hay tiempo para hablar tonterías, vamos al grano...

Primero, veamos la estructura del archivo:

Angular-ocLazyLoad           --- Carpeta demo
  Scripts               --- Carpeta de framework y plugins
    angular-1.4.7          --- angular, no se explica
    angular-ui-router        --- uirouter, no se explica
    oclazyload           --- ocLazyload, no se explica
    bootstrap            --- bootstrap, no se explica
    angular-tree-control-master   --- angular-tree-control-master, no se explica
    ng-table            --- ng-table, no se explica
    angular-bootstrap        --- angular-bootstrap, no se explica
  js                 --- Carpeta js, archivos js escritos para el demo
    controllers           --- Carpeta de controladores de páginas
      angular-tree-control.js   --- angular-tree-Código del controlador control
      default.js         --- Código del controlador default
      ng-table.js         --- ng-Código del controlador de table
    app.config.js          --- Código de registro y configuración de módulos
    oclazyload.config.js      --- Código de configuración de carga de módulos
    route.config.js         --- Configuración de rutas y código de carga
  views                --- Carpeta de páginas html
    angular-tree-control.html    --- angular-tree-Página de efectos del plugin control
    default.html          --- página default
    ng-table.html          --- ng-Página de efectos del plugin table
    ui-bootstrap.html        --- Página de efectos del plugin uibootstrap
  index.html             --- Página principal

Nota: Este demo no realiza rutas anidadas, solo implementa rutas de vista única para mostrar el efecto.

Vamos a ver el código de la página principal:

<!DOCTYPE html>
<html lang="es" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta charset="utf-8-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">página principal</a>
    <a href="#/uibootstrap" >ui-bootstrap</a>
    <a href="#/ngtable">ng-tabla</a>
    <a href="#/ngtree">angular-tree-control</a>
  </div>
  <div ui-vista></div>
</div>
</cuerpo>
</html>

en esta página, solo se cargaron css de bootstrap, js de angular, ui-js de router, js de ocLazyLoad, así como3archivos js configurados.

mira el código html de cuatro páginas:

angular-tree-control página de efecto

<treecontrol tree-modelo="ngtree.treeData" clase="árbol-ng clásico-abrigo" opciones="ngtree.treeOptions">
   {{node.título}}
 </treecontrol>

en la página hay una instrucción correspondiente al plugin.

página default

<div clase="ng-abrigo">
   {{default.valor}}
 </div>

solo se utiliza para demostrar que se carga y ejecuta correctamente default.js.

ng-página de efecto tabla

<div clase="ng-abrigo">
  <div clase="p-h-p md-fondo v-caja blanca-posicion sombra-rlt">
    <h3 clase="sin"-margen">ng-tabla</h3>
  </div>
  <botón ng-hacer clic="ngtable.tableParams.ordenamiento({})" clase="botón btn-por defecto tirar-derecho">Borrar ordenamiento</botón>
  <p>
    <fuerte> Ordenamiento:</<fuerte> {{ngtable.tableParams.ordenamiento()|json}}
  </p>
  <tabla ng-tabla="ngtable.tableParams" clase="tabla tabla-tabla con borde-rayado">
    <tr ng-repetir="user in $data">
      <td data-title="[#1#]" ordenable="'nombre'">
        {{user.nombre}}
      </td>
      <td data-title="[#2#]" ordenable="'edad'">
        {{user.edad}}
      </td>
    </tr>
  </tabla>
</div>

aquí se escribió algo simple ng-efecto de tabla.

ui-página de efecto bootstrap

<span uib-desplegable clase="ng"-abrigo">
   <a href id="simple"}}-dropdown" uib-dropdown-toggle>
     desplegable de abajo
   </a>
   <ul class="uib-dropdown-menu dropdown-menu" aria-labelledby="simple-dropdown">
     Contenido del desplegable. Aquí escriba un efecto para demostrar que se puede cargar dinámicamente.
   </ul>
 </span>

Aquí solo se escribió un efecto de desplegable para demostrar que se cargó y usó correctamente el complemento.

Bien, después de ver html, veamos la configuración de carga y configuración de rutas:

"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.directive;
          tempApp.filter = $filterProvider.register;
          tempApp.factory = $provide.factory;
          tempApp.service = $provide.service;
          tempApp.constant = $provide.constant;
        });

El código anterior para el registro del módulo solo depende de ui.router y oc.LazyLoad. La configuración es solo una configuración simple del módulo, para que el js pueda identificar los métodos de tempApp en el futuro.

Entonces, veamos la configuración del módulo 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",routeFn]);
function routeFn($stateProvider,$urlRouterProvider){
  $urlRouterProvider.otherwise("/default");
  $stateProvider
  .state("default",{
    url:"/default",
    templateUrl:"views/default.html",
    controller:"defaultCtrl",
    controllerAs:"default",
    resolve:{
      deps:["$ocLazyLoad",function($ocLazyLoad){
        return $ocLazyLoad.load("js/controllers/default.js");
      }]
    } 
  });
  .state("uibootstrap",{
    url:"/uibootstrap",
    templateUrl:"views/ui-bootstrap.html",
    resolve:{
      deps:["$ocLazyLoad",function($ocLazyLoad){
        return $ocLazyLoad.load("ui.bootstrap");
      }]
    } 
  });
  .state("ngtable",{
    url:"/ngtable",
    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",
    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 desplegable simple no requiere controlador, por lo que solo veremos ng-table y angular-tree-control del controlador js:

ng-table.js

(function(){
"use strict"
tempApp
.controller("ngTableCtrl",["$location","NgTableParams","$filter",ngTableCtrlFn]);
function ngTableCtrlFn($location,NgTableParams,$filter){
  //Datos
  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 });
  this.tableParams = new NgTableParams(  // Combinar la configuración predeterminada y los parámetros de la URL
    angular.extend({
      page: 1,      // Primera página
      count: 10,     // Cantidad de datos por página
      sorting: {
        name: 'asc'   // Ordenación predeterminada
      }
    },
    $location.search())
    ,{
      total: data.length, // Número total de datos
      getData: function ($defer, params) {
        $location.search(params.url()); // Poner los parámetros en la URL para evitar que la página se retroceda a la primera página y la configuración predeterminada al recargar
        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(){
  //Datos del árbol
  this.treeData = [
        {
          id:""1"
          title:"Etiqueta"1"
          childList:[
            {
              id:""1-1"
              title:"Subnivel"1"
              childList:[
                {
                  id:""1-1-1"
                  title:"Subnivel"1"
                  childList:[]
                }
              ]
            },
            {
              id:""1-2"
              title:"Subnivel"2"
              childList:[
                {
                  id:""1-2-1"
                  title:"Subnivel"2"
                  childList:[
                    {
                      id:""1-2-1-1"
                      title:"Subsubnivel"1"
                      childList:[]
                    }
                  ]
                }
              ]
            },
            {
              id:""1-3"
              title:"Subnivel"3"
              childList:[]
            }
          ]
        },
        {
          id:""2"
          title:"Etiqueta"2"
          childList:[
            {
              id:""2-1"
              title:"Subnivel"1"
              childList:[]
            },
            {
              id:""2-2"
              title:"Subnivel"2"
              childList:[]
            },
            {
              id:""2-3"
              title:"Subnivel"3"
              childList:[]
            }
          ]}
        ,
        {
          id:""3"
          title:"Etiqueta"3"
          childList:[
            {
              id:""3-1"
              title:"Subnivel"1"
              childList:[]
            },
            {
              id:""3-2"
              title:"Subnivel"2"
              childList:[]
            },
            {
              id:""3-3"
              title:"Subnivel"3"
              childList:[]
            }
          ]
        }
      ];
  //Configuración de árbol
  this.treeOptions = {
    nodeChildren:"childList",
    dirSelectable:false
  };
};
})();

Ignoraremos default.js, después de todo, solo hay un "Hello Wrold" en él.

url de github https://github.com/Programa-Monkey/Angular-ocLazyLoad-Demo

Aquí está la recopilación de información sobre la carga dinámica de módulos y dependencias de AngularJS, continuaremos complementando información relevante, ¡gracias por el apoyo de todos a este sitio!

Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)

Te gustará