Ich habe eine Anforderung, in der ich Fabrik schreiben sollte. Diese Factory sollte 3 Funktionen enthalten: Init, Speichern und Löschen

Ich sollte die Init-Funktion vom Controller aus aufrufen. Diese Funktion gibt ein Objekt zurück. Dieses Objekt hat die Funktion, die Funktion zum Hinzufügen und Löschen auszuführen.

Wie kann ich das erreichen?

Es folgt mein Code: Er führt die Init-Funktion erfolgreich aus, aber wenn ich versuche, das Objekt zu verwenden, das beim Hinzufügen oder Löschen zurückgegeben wurde, heißt es, dass das Objekt leer ist

angularApp.factory('SomeFactory', function(){
var client = new Client(); // this client is defined in another javascript file
                           // this is the object which we should return
var clientReady = function () {
     var cv = client.GetVersion();
     showIDs();
};
return {
    initClient:function(requiredUID){
        client.setAttribute("clientReadyCallback",clientReady);
    }//,

};
 var add = function () {
     client.someapi;
 };
var delete = function () {
     client.someapi;
 };`
});

in controller i call the below calls
SomeFactory.initClient("username");
SomeFactory.add();// throws error

Wie kann ich das erreichen?

7
user1834664 21 Nov. 2013 im 20:56

3 Antworten

Beste Antwort

Zunächst einmal geben Sie keine Fabrik zurück, sondern einen Service. Es ist eine Fabrik, die einen Dienst erstellt. Passen Sie daher Ihre Namenskonvention wie folgt an: app.factory('someService'

Ihr Code ist ein Chaos und weist Fehler auf. Ich zeige Ihnen daher nur die Grundlagen für die Rückgabe eines Serviceobjekts.

app.factory('someService', function() {
  var someService = {  //build this object however you want
    add: function() {

    },
    save: function() {

    }
  };

  return someService; //return the object
}); //end factory

In Ihrem Controller: someService.add();

19
m59 21 Nov. 2013 im 17:06

Dies ist ein Authentifizierungsfaktor aus einem realen Projekt

//factory using firebase Athentication service
myApp.factory('Authentication', function($firebase,$firebaseAuth,$location){

	var ref = new Firebase("URL_to_firebase");
    var simpleLogin = $firebaseAuth(ref);

    var myObject = {
    	//user is the data from the FORM
    	login : function(user){
    		return simpleLogin.$authWithPassword({
			  email: user.email,
			  password: user.password
			});
    	}//login
    }//password

    return myObject;//factory should return something

});

//and then you call like this in your controller
myApp.controller('myController' , function($scope, $location, $firebaseAuth,Authentication){
	
	$scope.login = function() {
		Authentication.login($scope.user)
	} //login

	
});
2
Nejmeddine Jammeli 26 Mai 2015 im 23:04

Eine Fabrik und ein Service unterscheiden sich tatsächlich in einer einfachen, aber sehr, sehr wichtigen Weise.

Eine Fabrik gibt Dienste zurück, die neu erstellt werden können.

Mit anderen Worten, Sie können dies tun:

var instanceOne = new $factory;
var instanceTwo = new $factory;

... und nennen sie dann als separate Einheiten. Genau darum geht es im Fabrikmuster.

Hier ist ein einfaches Beispiel einer Fabrik, von der Sie Kopien erhalten können ...

app.factory('myFactory', function() {
    return {
        talk: function(what) {
            return "Say " + what;
        }
    }
});

Wenn Sie stattdessen einen Dienst möchten, müssen Sie die darin enthaltenen Methoden mit this.methodName referenzieren. Dann geben Sie nur den Dienst selbst oder ein Singleton-Muster zurück. Wie so ...

app.service('myService', function() {
    this.talk = function(what) {
        return "Say " + what;
    };
});

Als Anmerkung; Wenn Sie sich meinen Code ansehen, unterstützt Angular jetzt das tatsächliche Definieren von Diensten über das Dienstschlüsselwort oder das Factory-Schlüsselwort. In der Quelle können Sie sehen, dass beide buchstäblich auf denselben Code verweisen.

So ähnlich sind sie sich, und tatsächlich sind diese beiden Fabrik- und Servicemethoden austauschbar. Wenn Sie also zuerst verwirrt waren, schwitzen Sie nicht. Es gibt fast keinen Unterschied ... fast :)

... viele Leute scheinen wissen zu wollen: "Wie können Sie eine Fabrik oder Dienstleistung zurückgeben, die nur eine Funktion hat, d. h. sie selbst ist die Funktion?" Einfach .. so ...

app.factory('myFactory', function() {
    return function(what) {
            return "Say " + what;
    }
});
3
Nick Steele 30 Juni 2016 im 21:29