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

Caricamento dinamico di moduli e dipendenze in AngularJs

Recentemente il progetto è molto impegnativo, devo lavorare di giorno e tornare a casa di sera per fare presentazioni di punti di conoscenza Angular per i miei colleghi, dopo tutto, sto per dimettermi alla fine dell'anno, lo sviluppo successivo del progetto deve essere assunto da qualcun altro, quindi ho utilizzato il mio tempo di studio serale. Originariamente non avevo intenzione di scrivere queste note di studio delle estensioni di terze parti, ma ho pensato che caricare i moduli su richiesta e usarli con successo è davvero utile, quindi le ho registrate. Poiché questo animale non ha utilizzato molto deeply requireJs, non sa cosa c'è di diverso tra questi due e non può spiegare chiaramente se questo è davvero un caricamento su richiesta di Angular.

Per ottenere l'effetto del punto di apprendimento di questa nota, dobbiamo utilizzare:

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

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

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

Non c'è bisogno di inutili parole, andiamo direttamente al punto...

Prima di tutto, diamo un'occhiata alla struttura dei file:

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          --- Codice di registrazione e configurazione dei moduli
    oclazyload.config.js      --- Codice di configurazione del caricamento dei moduli
    route.config.js         --- Codice di configurazione e caricamento delle rotte
  views                --- Cartella delle pagine html
    angular-tree-control.html    --- Pagina dell'effetto del plugin angular-tree-control
    default.html          --- Pagina predefinita
    ng-table.html          --- Pagina dell'effetto del plugin ng-table
    ui-bootstrap.html        --- Pagina dell'effetto del plugin uibootstrap
  index.html             --- Pagina principale

Attenzione: questo demo non ha implementato il routing annidato, ma ha semplicemente realizzato il routing di una singola vista per mostrare l'effetto.

Vediamo il codice della pagina principale:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<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">Pagina principale</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>

In questa pagina, abbiamo caricato solo i file css di bootstrap, i file js di angular, i file js di ui-router, i file js di ocLazyLoad e 3 file di configurazione.

Guardiamo ora il codice HTML delle quattro pagine:

Pagina dell'effetto angular-tree-control

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

Sulla pagina ci sono delle istruzioni corrispondenti a questo plugin.

Pagina default

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

Qui serviamo solo a dimostrare che il file default.js è stato caricato e eseguito correttamente.

Pagina dell'effetto 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">Annulla ordinamento</button>
  <p>
    <strong>Ordinamento:</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="[#1#]" sortable="'name'">
        {{user.name}}
      </td>
      <td data-title="[#2#]" sortable="'age'">
        {{user.age}}
      </td>
    </tr>
  </table>
</div>

Ecco alcuni effetti semplici di ng-table.

Pagina degli effetti ui-bootstrap

<span uib-dropdown class="ng-cloak">
   <a href id="simple-dropdown" uib-dropdown-toggle>
     Trigger del menu a discesa
   </a>
   <ul class="uib-dropdown-menu dropdown-menu" aria-labelledby="simple-dropdown">
     Contenuto del menu a discesa. Scrivi un effetto per dimostrare che il caricamento dinamico è stato implementato.
   </ul>
 </span>

Qui è stato scritto solo un effetto di menu a discesa per dimostrare che il plugin è stato caricato e utilizzato correttamente.

Bene, abbiamo visto l'html, ora guardiamo la configurazione di caricamento e la configurazione delle rotte:

"uso severo"
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;
        });

Il codice sopra registrato i moduli dipende solo da ui.router e oc.LazyLoad. La configurazione è anche semplicemente configurata per i moduli, in modo che i metodi su tempApp possano essere riconosciuti nei js successivi.

Poi vediamo la configurazione del modulo caricato da ocLazyLoad:

"uso severo"
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
  });
};

路由的配置:

"uso severo"
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");
          }
        );
      }]
    } 
  )
};

L'implementazione semplice della casella a discesa di ui-bootstrap non richiede un controller, quindi vediamo solo i controller js di ng-table e angular-tree-control:

ng-table.js

(function(){
"uso severo"
tempApp
.controller("ngTableCtrl",["$location","NgTableParams","$filter",ngTableCtrlFn]);
function ngTableCtrlFn($location,NgTableParams,$filter){
  //dati
  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(  // combina la configurazione predefinita e i parametri dell'URL
    angular.extend({
      page: 1,      // prima pagina
      count: 10,     // numero di dati per pagina
      sorting: {
        name: 'asc'   // ordinamento predefinito
      }
    }
    $location.search())
    ,{
      total: data.length, // numero totale dei dati
      getData: function ($defer, params) {
        $location.search(params.url()); // aggiungi i parametri all'URL per evitare di tornare alla prima pagina e alle impostazioni predefinite
        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(){
"uso severo"
tempApp
.controller("ngTreeCtrl",ngTreeCtrlFn);
function ngTreeCtrlFn(){
  //dati dell'albero
  this.treeData = [
        {
          id: "1",
          title: "etichetta1",
          childList:[
            {
              id:"1-1"
              title:"Livello figlio 1",
              childList:[
                {
                  id:"1-1-1",
                  title:"Livello superiore figlio 1",
                  childList:[]
                }
              ]
            }
            {
              id:"1-2",
              title:"Livello figlio 2",
              childList:[
                {
                  id:"1-2-1",
                  title:"Livello superiore figlio 2",
                  childList:[
                    {
                      id:"1-2-1-1",
                      title:"Livello superiore figlio 1",
                      childList:[]
                    }
                  ]
                }
              ]
            }
            {
              id:"1-3",
              title:"Livello figlio 3",
              childList:[]
            }
          ]
        }
        {
          id:"2",
          title:"Etichetta 2",
          childList:[
            {
              id:"2-1",
              title:"Livello figlio 1",
              childList:[]
            }
            {
              id:"2-2",
              title:"Livello figlio 2",
              childList:[]
            }
            {
              id:"2-3",
              title:"Livello figlio 3",
              childList:[]
            }
          }]
        ,
        {
          id:"3",
          title:"Etichetta 3",
          childList:[
            {
              id:"3-1",
              title:"Livello figlio 1",
              childList:[]
            }
            {
              id:"3-2",
              title:"Livello figlio 2",
              childList:[]
            }
            {
              id:"3-3",
              title:"Livello figlio 3",
              childList:[]
            }
          ]
        }
      ];
  //Configurazione dell'albero
  this.treeOptions = {
    nodeChildren:"childList",
    dirSelectable:false
  };
};
})();

Ignoriamo il file default.js, dopo tutto, contiene solo "Hello World".

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

Ecco la raccolta di materiali relativi al caricamento dinamico dei moduli e delle dipendenze di AngularJS, continueremo a integrare ulteriori materiali, grazie per il supporto della nostra comunità!

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non possiede il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare