2016-04-15 13 views
0

So verstehe ich den Zweck eines IIFE ist, sie aus dem globalen Geltungsbereich zu nehmen. Im Angular Stil guide, heißt es, dies zu vermeiden:Wohin gehen in einem IIFE deklarierte Variablen?

/* avoid */ 
// logger.js 
angular 
    .module('app') 
    .factory('logger', logger); 

// logger function is added as a global variable 
function logger() { } 

// storage.js 
angular 
    .module('app') 
    .factory('storage', storage); 

// storage function is added as a global variable 
function storage() { } 

und statt dies tun:

/** 
* recommended 
* 
* no globals are left behind 
*/ 

// logger.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('logger', logger); 

    function logger() { } 
})(); 

// storage.js 
(function() { 
    'use strict'; 

    angular 
     .module('app') 
     .factory('storage', storage); 

    function storage() { } 
})(); 

Ich gehe davon aus das macht die Speicherfunktion für mich in einem Controller einige Zeit anrufen später ... aber wo genau ist es, wenn es nicht im globalen Umfang ist?

+0

verwendet Winkel aber die API hilft 'storage' zu "eckig" oder irgendeine Art von Objekt, das als "app" bezeichnet wird und es möglicherweise mit dem Alias ​​"Speicher" zugänglich gemacht hat. – Marty

+0

@Marty Hmm ... ich denke das macht Sinn. In diesem Fall gibt es der Fabrik Zugriff auf die Speicherfunktion, aber sonst nichts richtig? – PDN

Antwort

2

Der Zweck des direkt aufgerufenen IIFE-Funktionsausdrucks besteht darin, Ihren Code zu modularisieren, um isolierte Ausführungsbereiche zu erstellen. Angular verfügt über ein Dependency-Injection-System, bei dem die angegebenen Elemente (Fabrik, Service, Controller, Richtlinie usw.) registriert sind und unabhängig von ihrem Standort durch Injektion verwendet werden können. Dies wird Ihnen von der eckigen FW zur Verfügung gestellt. Angular hat implizite und explizite Injektion;

Die implizite Injektion verwendet die Namen der Funktionsparameter, um die zu injizierenden Abhängigkeiten automatisch zu erkennen. Dies ist gut für die Entwicklung, aber bricht den verkleinerten Code. Gute Nachrichten gibt es Tools, die Ihre explizite Injektion in explizite, z. B. ng-anotate konvertieren können. Ihre implizite Code-Injektion würde aussehen wie

// storage.js 
(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .factory('storage',storage); 

    function storage(logger) { 
    // use logger 
    } 
})(); 

die explizite Modus ist, wo man tatsächlich die Liste der Parameter zur Verfügung stellen, die durch und Array von ihren registrierten Namen übergeben werden sollen, und sie dann mit den Funktionsargumenten entsprechen. Ihr Code würde mit expliziter Injektion wie folgt aussehen

// storage.js 
(function() { 
    'use strict'; 

    angular 
    .module('app') 
    .factory('storage', ['logger',storage]); 

    function storage(logger) { 
    // use logger 
    } 
})(); 

oder

angular 
    .module('app') 
    .factory('storage', storage); 
    storage.$inject = ['logger']; 

    function storage(logger) { 
    // use logger 
    } 

Ich hoffe, das

Formulierung legt nahe, Sie haben als Fabrik gebunden nie
+0

also sagst du später kann ich implictly/explizit Speicher injizieren? Ich denke, ich habe gefragt, wo die Speicherfunktion gespeichert ist, aber Martys Kommentar hat mir geholfen, das zu verstehen, und Ihre Antwort ist eine sehr informative Erweiterung! – PDN

+0

Die Speicherfunktion wird durch das DI-System des Winkels referenziert. wo es lebt ist nicht wichtig, was wichtig ist, dass Sie es von überall im Winkelcode referenzieren können, wenn Sie es injizieren oder wenn Sie durch Ihre Anwendungen $ injector angefordert haben –

Verwandte Themen