2013-11-21 110 views
6

我有一个要求我应该写工厂的要求。这个工厂应该包含3个函数init,保存和删除AngularJS工厂如何返回对象

我应该从控制器调用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 

我怎样才能做到这一点?

+0

你永远不会到达'var add = function()...',因为你在它之前返回。 – Beterraba

+0

即使我驴里面的这些函数返回逗号分隔,它仍然不起作用 – user1834664

+0

你可以把你的代码放在小提琴中吗? – Beterraba

回答

18

首先,你没有返回工厂,而是一个服务。这是一个创建服务的工厂,因此请调整您的命名约定,如下所示: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();

+0

非常感谢。它的工作现在很好。 – user1834664

+0

其实这个答案是有点关闭。返回一个对象实际上是一个工厂,而不是一个服务。 返回一个对象允许工厂生成一个新的实例,即它可以是new'd,使您能够从一个注入源生成多个服务副本。有关详细信息,请参阅以下文章:http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/或我在此问题中的回答 –

+1

您不是在说与我说的不同的东西。您只是添加了一个关于使用'new'创建新实例的额外细节。我想到的方式与角度无关。您可以根据您希望的服务的注入价值进行操作。至于你的回答,'var instanceOne = new $ factory;'是不准确的命名。工厂是一种创造某种东西的功能。你的例子中的'$ factory'是工厂创建的一个'service'。 – m59

2

这是一个真正的项目的鉴别工厂

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

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

 
    var myObject = { 
 
    \t //user is the data from the FORM 
 
    \t login : function(user){ 
 
    \t \t return simpleLogin.$authWithPassword({ 
 
\t \t \t email: user.email, 
 
\t \t \t password: user.password 
 
\t \t \t }); 
 
    \t }//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){ 
 
\t 
 
\t $scope.login = function() { 
 
\t \t Authentication.login($scope.user) 
 
\t } //login 
 

 
\t 
 
});

1

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

A 工厂返回可以new'd的服务。

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

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; 
    } 
});