Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS工厂如何返回对象_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS工厂如何返回对象

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

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

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

我怎样才能做到这一点

下面是我的代码,它成功地执行了init函数,但当我尝试使用add或delete中返回的对象时,它表示该对象为空

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自己的措辞我同意您所说的一切。我可能应该说我正在添加更多的细节,而不是“答案有点偏离”,回过头来看,我可以看出这可能是冒犯或暗示你犯了错误。对此我很抱歉,并将使用此交互来改善我的行为。你说得对,我的名字不准确。我只是想指出单件方法和工厂方法的重要性,大多数人不知道发生了什么,或者有什么不同,当他们需要一种或另一种方法时会感到困惑,开始寻找重新发明轮子的方法。啊。我现在明白你的意思了。酷。这是一个有用的细节。