2016-06-17 23 views
0

undefined macht Während Winkel Lernen, Lesen a blog die aufwendige dassangular.injector.invoke mein Controller

können wir Fabrik/Service außerhalb der Steuerung zugreifen angular.injector() verwenden, aber wenn ich das versuchen, gibt es mein Haupt-Controller ist undefined Fehler und alles funktioniert nicht mehr.

siehe working plunker mit kommentierten Täter Code block.Below ist Hauptcode der Linien angular.injector(["app"]).invoke

var app = angular.module('AlphaModule', []); 
// service added 
app.service('tea', function(){ 
    return { 
     teaType: function(teaType) { 
      console.log('Service => Morning tea must be ' + teaType); 
     }, 
     sayHello: function(msg) { 
      console.log('Service => Hello ' + msg); 
     } 
    }; 
}); 

// ERROR in console when uncomment this code block 
angular.injector(["app"]).invoke(function(tea){ 
    tea.sayHello('Yellow'); 
}); 

// main controller definition 
var AlphaController = function($injector, tea) { 
    var vm = this; 
    vm.timeNow = new Date().getTime(); 
    .... 
}; 

app.controller('AlphaController', AlphaController); 

Bitte markieren Sie mit, was mir fehlt/falsch hier?

Meine Vermutung:

Ich habe auch gelesen, dass $ Injektor Singletons sind. Was genau bedeutet das? können wir $injector nur einmal verwenden! oder möglicherweise ist dies das Problem, da ich $ Injektor in .controller auch verwendet habe

+0

Während die akzeptierte Antwort richtig ist, tut es nicht, was Sie denken, es tut. 'angular.injector' erstellt einen neuen Injektor, es ruft nicht den Injektor ab, der mit der App verknüpft ist, die Sie bereits erstellt haben. Services sind Singletons in dem Sinne, dass sie nur einmal pro Injektor erstellt werden. So wird der "Tee" -Service in Ihrem "Aufruf" nicht der gleiche wie der "Tee" -Service in Ihrer App sein. – tasseKATT

+0

werden Sie am Beispiel "der Tee-Service in Ihrer Berufung wird nicht der gleiche wie der Tee-Service in Ihrer App sein". Ich bin sehr daran interessiert zu lernen. –

+0

Wenn Ihre Anwendung bootstrapped wird ein Injektor erstellt und zugeordnet, wenn Ihre App. Dienste, die in Ihrer App verwendet werden, werden nur einmal erstellt (pro Injektor, dh pro App). 'angular.injector' erstellt einen neuen Injektor und erstellt alle benötigten Dienste noch einmal. Die Dienstinstanz ist also nicht identisch, was zu einem Problem führen kann, wenn Ihr Dienst einen Status behält. – tasseKATT

Antwort

2

Ihr Modulname ist falsch. Modulname ist tatsächlich AlphaModule nicht app.

angular.injector(["AlphaModule"]).invoke(function(tea){ 
 
    tea.sayHello('Yellow'); 
 
});

+0

Vielen Dank. Ich verstehe nicht, warum Fehler nicht so klar sind :( –

+0

willst du bitte einen Blick auf meine vorherige Frage ==> http://stackoverflow.com/questions/37850557/with-no-named-function-for-get- in-provider-is-working-fine –

+0

Das kann irreführend sein.Siehe meinen Kommentar zu der Frage. – tasseKATT