AngularJS工厂如何返回一个对象

时间:2013-11-21 16:56:38

标签: javascript angularjs

我有一个要求我应该写工厂的要求。该工厂应包含3个函数init,save和delete

我应该从控制器调用init函数。此函数返回一个对象。该对象具有执行添加和删除功能的功能。

我怎样才能实现这一目标?

以下是我的代码,它成功执行了init函数但是当我尝试使用添加或删除时返回的对象时,它说对象是空的

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

我怎样才能实现这个目标?

3 个答案:

答案 0 :(得分:19)

首先,您不是返回工厂,而是返回服务。它是一个创建服务的工厂,因此请调整您的命名约定:app.factory('someService'

您的代码很乱并且有错误,因此我将向您展示返回服务对象的基础知识。

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

    },
    save: function() {

    }
  };

  return someService; //return the object
}); //end factory
控制器中的

someService.add();

答案 1 :(得分:3)

工厂和服务实际上是不同的一个简单但非常非常重要的方式。

工厂会返回可能是新的服务

换句话说,你可以这样做:

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

...然后将它们称为单独的实体。事实上,这就是工厂模式的全部内容。

以下是一个工厂的简单示例,您可以获得...

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

如果您需要服务,则需要通过this.methodName引用其中的方法,然后您只需返回服务本身,或单个模式。像这样......

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

作为旁注;如果你查看我的代码,Angular现在支持通过service关键字或factory关键字实际定义服务。在源代码中,您可以看到它们都是字面上引用相同的代码。

它们有多相似,事实上这两种工厂和服务方法是可以互换的,所以,如果你一开始感到困惑,就不要出汗了;几乎没有任何差别... 几乎:)

很多人似乎都想知道:"你如何归还一个只有一个功能的工厂或服务,即它本身就是这个功能?"容易..像这样...

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

答案 2 :(得分:2)

这是一个来自真实项目的认证工厂



//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

	
});