2016-05-31 18 views
1

Nach dem Winkel js docsAngular Js-Dienst gibt Funktion/Objekt zurück?

Service (Name, Konstruktor); Name: Name Konstruktor: Eine injizierbare Klasse (Konstruktorfunktion), die instanziiert wird.

Internally : 
{ 
    $get: function() { 
    return $injector.instantiate(constructor); 
    } 
} 

Es könnte aus den Winkel docs geschlossen werden, dass Service der als Konstrukteur und Anbieter erstellt eine Instanz erhalten durch $ Injektor und kehrt durch $ bestanden zweite Argument behandelt. Also, wann immer wir den Dienst in einer unserer Modulfunktionen (Controller, Direktiven etc) injizieren werden, sollte es das neu erstellte Objekt zurückgeben, das Singleton natürlich ist.

Jetzt kommt das Problem hier, wenn ich meinen Dienst wie diese Weisen definiere.

1. _app_user_content.service("MyService" , function(){ 
     this.Message = "Greetings!"; 
    }); //returns object when injected. 
2. _app_user_content.service("MyService" , function(){ 
     this.Message = "Greetings!"; 
     return "123" 
    }); // returns object when injected. 
3. _app_user_content.service("MyService" , function(){ 
     this.Message = "Greetings!"; 
     return function(){} 
    }); //returns function(){} when injected. Doesnot return object 

Warum gibt der dritte Fall eine Funktion zurück?

Antwort

2

Dies ist eine JavaScript-Sache, mehr als eine eckige Sache.

Was ein Winkel service tut, ist im Grunde Ihre Funktion als Konstruktor von new SomeObject() tun, SomeObject die Funktion, die Sie im zweiten Argumente definiert ist (wichtig, dass in JavaScript-Funktionen zu beachten, Objekte).

Wenn Ihre Funktion nichts oder einen primitiven Wert zurückgibt, ignoriert der Konstruktor Ihren Rückgabewert und gibt stattdessen den Wert zurück, den Sie für den Bereich (diese) der Funktion festgelegt haben. Wenn Sie jedoch ein Objekt zurückgeben, scheint der Konstruktor das Objekt stattdessen zurückzugeben. (Danke @ajaykumar)

Versuchen Sie, diese in Browser-Konsole ...

function potato() {this.yummy = true; return function() {};} 
function tomato() {this.yummy = true;} 
console.log(new potato()); 
console.log(new tomato()); 

Sie sollten Kartoffel Rückkehr function() {} sehen.

Sie sollten Tomate Rückkehr {yummy: true} sehen.

Für Konstruktorfunktionen wie diese würde ich empfehlen, nichts zurückzugeben.

Wenn Sie jedoch die Winkel factory Methode verwenden waren, werden Sie, dass anstatt das zu tun new SomeObject() Winkel finden tun return SomeObject(), in dem Fall, dass Sie ein Objekt mit allen möglichen Funktionen/Parameter zurückgeben möchten Sie in Ihren Dienst verfügbar machen möchten.

Weitere Informationen über das JavaScript new Schlüsselwort, Prototypen und Konstruktorfunktionen here.

+1

Ihre Antwort zeigt richtig auf Javascript syntaktische Grundlagen. Weitere Untersuchungen, konnte ich schließen, dass, wenn die Funktion javascript primitives zurückgibt es das neu erstellte Objekt zurückgibt. Wenn die return-Anweisung jedoch andere als primitive Typen enthält, weist sie einfach die return-Anweisung zu und erstellt kein Objekt. – ajaykumar