Javascript AngularJS工厂如何返回对象
我有一个写工厂的要求。此工厂应包含3个函数init、save和delete 我应该从控制器调用init函数。此函数返回一个对象。此对象具有执行添加和删除功能的功能 我怎样才能做到这一点 下面是我的代码,它成功地执行了init函数,但当我尝试使用add或delete中返回的对象时,它表示该对象为空Javascript AngularJS工厂如何返回对象,javascript,angularjs,Javascript,Angularjs,我有一个写工厂的要求。此工厂应包含3个函数init、save和delete 我应该从控制器调用init函数。此函数返回一个对象。此对象具有执行添加和删除功能的功能 我怎样才能做到这一点 下面是我的代码,它成功地执行了init函数,但当我尝试使用add或delete中返回的对象时,它表示该对象为空 angularApp.factory('SomeFactory', function(){ var client = new Client(); // this client is defined in
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
我怎样才能做到这一点呢?首先,您返回的不是工厂,而是服务。它是一个创建服务的工厂,因此调整命名约定如下:
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();
这是来自真实项目的身份验证工厂
//使用firebase Athentication服务的工厂
myApp.factory('Authentication',函数($firebase、$firebaseAuth、$location){
var ref=新Firebase(“URL_至_Firebase”);
var simpleLogin=$firebaseAuth(ref);
变量myObject={
//用户是表单中的数据
登录:功能(用户){
返回simpleLogin.$authWithPassword({
电子邮件:user.email,
密码:user.password
});
}//登录
}//密码
return myObject;//工厂应该返回一些内容
});
//然后你在你的控制器里这样叫
控制器('myController',函数($scope,$location,$firebaseAuth,Authentication){
$scope.login=函数(){
Authentication.login($scope.user)
}//登录
})一个工厂和一个服务在一个方面实际上是不同的,虽然很简单,但是非常非常重要
工厂返回可以是新的服务
换句话说,您可以这样做:
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;
}
});
你永远不会到达var add=function()…
,因为你是在返回之前返回的。即使我在返回中使用逗号分隔的函数,它仍然不起作用。你能把你的代码放在小提琴里吗?我发布的代码是剥离代码。实际代码受公司政策的限制很大。所以,即使我把它贴在小提琴上,它也可能不起作用。事实上,这个答案有点错误。返回对象实际上是一个工厂,而不是一个服务。返回一个对象允许工厂生成一个新实例,也就是说,它可以是新的,从而使您能够从单个注入源生成服务的多个副本。请参阅本文了解详细信息:或者我在这个问题上的回答您所说的与我所说的没有任何不同。您只是添加了一个关于使用new
创建新实例的附加细节。依我看,这与角度无关。您可以按照自己的意愿对服务的注入价值进行操作。至于你的答案,var instanceOne=new$factory代码>命名不准确。工厂是一种创造东西的功能$factory
在您的示例中,它是由工厂创建的,是一项服务
@NickSteele请参见文件中Angular自己的措辞我同意您所说的一切。我可能应该说我正在添加更多的细节,而不是“答案有点偏离”,回过头来看,我可以看出这可能是冒犯或暗示你犯了错误。对此我很抱歉,并将使用此交互来改善我的行为。你说得对,我的名字不准确。我只是想指出单件方法和工厂方法的重要性,大多数人不知道发生了什么,或者有什么不同,当他们需要一种或另一种方法时会感到困惑,开始寻找重新发明轮子的方法。啊。我现在明白你的意思了。酷。这是一个有用的细节。