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