Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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,在重构一个相当大的项目之前,我真的很想了解angular的服务/工厂/提供者结构 我读过很多关于服务与工厂的文档和文章,我认为我了解它们是如何创建的,以及它们是做什么的 然而,在尝试一些东西时,我尝试在一两家工厂使用一项服务 这真的很有用:我现在知道我的“jsonService”只有一个(它是一个单例),所以这种简单的方法不起作用。。。(我需要每个工厂都有一个单独的实例) 当我在控制器中使用工厂时,如: myController.f1= fac1; myController.f2= fac2.s

在重构一个相当大的项目之前,我真的很想了解angular的服务/工厂/提供者结构

我读过很多关于服务与工厂的文档和文章,我认为我了解它们是如何创建的,以及它们是做什么的

然而,在尝试一些东西时,我尝试在一两家工厂使用一项服务

这真的很有用:我现在知道我的“jsonService”只有一个(它是一个单例),所以这种简单的方法不起作用。。。(我需要每个工厂都有一个单独的实例)

当我在控制器中使用工厂时,如:

myController.f1= fac1;
myController.f2= fac2.serviceData;
我可以看到fac1和fac2都返回相同的对象,它们都有{msg:'no data'},如果我更改了一个,那么它们都会更改

我的问题是:

即使我可以中断服务并看到data={msg:'no data'}并看到它被设置为响应数据-为什么我看不到fac1或fac2中的任何更改

我所能想到的是,某个地方一定有不止一个var数据,有些数据不是“单例”数据

编辑:我现在尝试:

this.serviceData= function(){return data;};
以及:

如果我(很久以后)打电话:

然后我得到了json数据。。。但是myController.f2仍然是{msg:'no data'}为什么?

试试这个:

this.serviceData = function(){
    return data;
};

另外,你可能有一个种族的情况$当应用程序请求提供服务数据时,http可能还没有返回。angular的“服务”和“工厂”之间的差别很小,我建议只使用其中一个,并坚持使用它。从这一点出发,我将这些元素称为“服务”,尽管我专门使用
angular.factory
来声明它们

对于您最终想要做的事情,有一个更简单的解决方案——只需从您的服务中返回承诺

this.get= function(url){
    return $http.get(url)
}
然后在控制器/指令/任何东西中,像这样使用它:

jsonService.get(url).then(function success(response) {
    // do things with the response
})
但是您似乎希望使用一个服务来创建许多实例,因此下面是一个人为的示例:

.factory('jsonService', jsonService)

jsonService.$inject = ['$http']
function jsonService($http) {
    return Fixed

    function Fixed(url) {
        this.url = url
        this.promise = null
        this.get = get.bind(this)

        function get() {
            // This caches the request so you only do it once, for example
            if (this.promise == null) {
                this.promise = $http.get(url)
            }
            return this.promise
        }
    }
}
然后在控制器中,您可以执行以下操作:

var fixedOne = new jsonService('fixedOne')
fixedOne.get().then(...)

好的,在尝试了m.e.conroy的建议后,我终于明白了

问题与角度无关,而是javascript如何传递对象。 (见:)

工厂传回原始{msg:'no data'}对象的“复制引用”,当服务最终分配时:

data= resp.data;
替换了“数据”,但工厂提供的引用作为旧对象保留

现在,如果我这样做:

.service('jsonService', ['$http', function ($http) {
    var data= {'msg':'no data', 'result':null};
    this.serviceData= data;
    this.get= function(url){
        $http.get(url).then(function (resp) {
            data.result= resp.data;  // update properties of the data object
            data.msg='got data!';    // instead of replacing it
        }); 
    }
}])
…那么一切都有意义了

myController中的变量在数据到达时更改(因为我没有“交换”数据对象)


显然,我仍然有一个问题,那就是我的两个工厂返回同一个对象(我将看看Sacho对此的建议)——但我认为我在这里学到了一些非常基本的东西。

比赛条件。。。我可以打开$http().then(),让应用程序运行,然后检查控制器——所以我认为我看对了。如果我执行myController.f2=fac2.serviceData(),我只会得到我的“无数据”对象,如果我稍后执行fac2.serviceData(),那么我会得到我期望的数据。。。i、 e.另一个目标你能解释一下你最终想要实现什么吗?是的,我最终想做一些常规的工作,获得一些jason数据功能/服务/提供者,并在多个工厂中使用它。然而,目前我只是对为什么会发生上述情况感兴趣,这样我才能更好地理解发生了什么。谢谢你。。。在我弄清楚当前示例中发生了什么之后,我将以这种方式尝试一些事情。
var fixedOne = new jsonService('fixedOne')
fixedOne.get().then(...)
data= resp.data;
.service('jsonService', ['$http', function ($http) {
    var data= {'msg':'no data', 'result':null};
    this.serviceData= data;
    this.get= function(url){
        $http.get(url).then(function (resp) {
            data.result= resp.data;  // update properties of the data object
            data.msg='got data!';    // instead of replacing it
        }); 
    }
}])