2015-07-12 6 views
12

Was sind die Unterschiede zwischen $injector.instantiate, $injector.get und $injector.invoke in AngularJS?

Antwort

20

mit dem folgenden Service:

app.service('myService', function ($q, $http) { 
    return { 
    q: $q, 
    http: $http 
    }; 
}); 

$ injector.get (Name, [Anrufer]);

Gibt eine Instanz des angeforderten Service zurück.

$injector.get('myService'); 
// { q: $q, http: $http } 

$ injector.invoke (fn, [self], [Einheimischen]);

Ruft die angegebene Methode auf und übergibt die angegebenen Argumente vom $ injector.

$injector.invoke(function (myService, $http) { 
    console.log(myService); // { q: $q, http: $http }; 
    console.log(this);  // { v: 'im this!' }; 
    console.log($http);  // null 
}, { v: 'im this!' }, { $http: null }); 

$ injector.instantiate (Type, [Einheimische]);

Erstellt eine neue Instanz des angegebenen Typs. Verwendet eine Konstruktorfunktion und ruft dann die neue Instanz mit den in der Konstruktorannotation angegebenen Argumenten auf.

Angenommen, die folgende 'Klasse':

function Person (fName, lName, $http, $q) { 
    return { 
    first_name: fName, 
    last_name: lName, 
    http: $http, 
    q: $q 
    } 
} 

Wenn wir nun eine neue Person in unserem Controller erstellen wollten, könnten wir es so machen:

app.controller('...', function ($injector) { 
    var $http = $injector.get('$http'); 
    var $q = $injector.get('$q'); 
    var p  = new Person('kasper', 'lewau', $http, $q); 

    console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: $http, q: $q }; 
}); 

Person Stellen Sie sich vor hatte ~ 20 Abhängigkeiten, und wir holten jeden einzelnen mit der $injector.get Methode.

Umständlich! Und - Sie müssten Ihre Parameter & Argumente synchron halten. ugh.

Stattdessen können Sie dies tun:

app.controller('...', function ($injector) { 
    var p = $injector.instantiate(Person, { 
    fName: 'kasper', 
    lName: 'lewau' 
    }); 
    console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: $http, q: $q }; 
}); 

Und - wenn wir wollten, könnten wir Einheimischen zum .instantiate Anruf liefern, um außer Kraft zu setzen, was die interne $injector.get() normalerweise erhalten, wenn instanziieren.

var p = $injector.instantiate(Person, { 
    fName: 'kasper', 
    lName: 'lewau' 
}, { $http: 'Nothing!', $q: 'Nothing!' }); 
console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: 'Nothing!', q: 'Nothing!' }; 

Ich hoffe, dass die Differenz zwischen den drei erklärt.Wenn Sie mehr Informationen über ihre Unterschiede benötigen würde ich diese Artikel empfehlen:

+0

$ aufrufen Hat, $ aufrufen bekommen verwendet, initialte() und $ invoke.invoke() ?? –

+0

Ich habe nicht die Quelle in diesem Moment vor mir, aber ich denke ja. Überprüfen Sie den Quellfreund. –

+2

Diese Antwort sollte ein Teil von Angular $ Injektor docs sein –

0

Weitere Noten Kasper Lewau Antwort, weil ich keine Kommentare hinzufügen kann.

$ injector.invoke (fn, [selbst], [lokal], [serviceName]); Klassenkonstruktor oder nicht (es hat Auto-Check innen)

  • 'Selbst' verwendet param nur für reine Funktion:

    • Kann für jede Funktion verwendet werden.

    $ injector.instantiate (Typ, [lokal]);

    • Sollte nur für Klassenkonstruktoren verwendet werden, oder es wird leeres Objekt konstruieren {}