2016-07-05 7 views
2

ich ein factory wie dieses:Wie Fabrik für den Zugriff auf von der Steuerung

rasm.factory('serviceUrl',[function(){ 
     function serviceUrl(){ 
      this.p = location.protocol; 
      this.h = getHost(); 
     } 
     serviceUrl.prototype.getServiceUrl = function(){ 
      return this.p +'//'+ this.h + '/services/' 
     } 
    }]) 

ich das objektorientierte way.This in JavaScript implementiert haben, ist die Ressource, die i https://medium.com/opinionated-angularjs/angular-model-objects-with-javascript-classes-2e6a067c73bc#.du8tor7h2

Mein Problem verwendet haben, ist , wie kann ich auf diese getServiceUrl Funktion von meinem Controller zugreifen. ist das überhaupt möglich? Danke Jungs

Antwort

4

Lesen Sie über Dependency Injection. Sie müssen sich zuerst, dass die Fabrik-Code ändern:

rasm.factory('serviceUrl',[function(){ 
    function serviceUrl(){ 
     this.p = location.protocol; 
     this.h = getHost(); 
    } 
    serviceUrl.prototype.getServiceUrl = function(){ 
     return this.p +'//'+ this.h + '/services/' 
    } 

    // This line has been added 
    return serviceUrl; 
}]); 

es dann in Ihrem Controller verwenden:

myApp.controller('MyCtrl', ['$scope', 'serviceUrl', function($scope, serviceUrl) { 

    serviceUrl.getServiceUrl(); 
}]); 

aktualisieren

Ich schlage vor, Sie Ihre Fabrik Code wie folgt zu ändern:

rasm.factory('serviceUrl', [function() { 
    var _this = this; 

    _this.p = location.protocol; 
    _this.h = getHost(); 

    return { 
     getServiceUrl: function() { 
      return _this.p +'//'+ _this.h + '/services/' 
     } 
    } 
}]); 
+1

Ich dachte, ich muss ein Objekt von ServiceUrl erstellen. wie folgt ** var obj = new serviceUrl(); obj.getServiceUrl() ** –

+0

Nein, Fabriken in Angular sind Singleton während des gesamten Lebenszyklus Ihrer App, dh Angular macht dasselbe ('new serviceUrl') intern nur einmal, dann wird dieselbe Instanz überall mit DI verfügbar gemacht. –

+1

eigentlich ist das nicht wahr, eckig ruft nicht das NEUE für Fabriken auf, sondern führt nur das Rezept aus, wenn es das Ergebnis zurückgibt (und zwischenspeichert). In diesem Fall denke ich, dass es angemessener ist, einen Dienst zu nutzen. – Karim

Verwandte Themen