Angularjs 角度服务定义:服务或工厂

Angularjs 角度服务定义:服务或工厂,angularjs,angularjs-service,Angularjs,Angularjs Service,我是一个棱角分明的新手,我正在构建一个应用程序,有一件事让我非常困惑,那就是定义服务有几种方法,我从这个链接中读到了更多: 那么,定义服务的方式似乎没有太大区别 但我只是注意到一个不同,我认为是不同的: 看到我从这里得到的服务了吗 var-app=angular.module('myApp',[]); 应用程序服务('test',函数($timeout,$q){ var self=这个; this.getSomething=function(){ 返回self.getData().then(函数

我是一个棱角分明的新手,我正在构建一个应用程序,有一件事让我非常困惑,那就是定义服务有几种方法,我从这个链接中读到了更多: 那么,定义服务的方式似乎没有太大区别

但我只是注意到一个不同,我认为是不同的:

看到我从这里得到的服务了吗

var-app=angular.module('myApp',[]);
应用程序服务('test',函数($timeout,$q){
var self=这个;
this.getSomething=function(){
返回self.getData().then(函数(数据){
返回self.compactData(数据);
});
};
this.getData=函数(){
var deferred=$q.deferred();
$timeout(函数(){
延期。决议(“foo”);
}, 2000);
回报。承诺;
};
this.compactData=函数(数据){
var deferred=$q.deferred();
控制台日志(数据);
$timeout(函数(){
延期。决议(“bar”);
}, 2000);
回报。承诺;
};
});
如果我使用下面的“工厂”定义此服务,则一个函数不能调用该服务的其他函数

app.factory('test',函数($timeout,$q){
返回{
getSomething:function(){
返回getData()。然后(函数(数据){
返回压缩数据(数据);
});
},
getData:function(){
var deferred=$q.deferred();
$timeout(函数(){
延期。决议(“foo”);
}, 2000);
回报。承诺;
},
compactData:函数(数据){
var deferred=$q.deferred();
控制台日志(数据);
$timeout(函数(){
延期。决议(“bar”);
}, 2000);
回报。承诺;
},
};
});
我将在浏览器控制台中获取此信息:

[08:41:13.701] "Error: getData is not defined
.getSomething@http://fiddle.jshell.net/_display/:47
Ctrl1@http://fiddle.jshell.net/_display/:75
invoke@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2795
instantiate@http://code.angularjs.org/1.0.0/angular-1.0.0.js:2805

有人能解释一下吗?谢谢。

您有两个大问题:

  • 工厂返回语法不正确的对象
  • javascript变量的作用域是函数式的
就是, 您应该返回像
{key:value,key:value}

值可以是函数。但是,返回
{key=value,key=value}

第一个修正:

返回{
getSomething:function(){…},
getData:函数。。。
}
其次,不能调用函数是正常的。看这个。我嘲笑一切。您可以调用服务返回的函数之一。但是,当从getSomething尝试调用getData时,会得到“未定义”:

app.factory('testSO',函数(){
返回{
getSomething:function(){
log('returngetsomething');
getData();
},
getData:函数(){
log('returngetdata');
}...
这与声明factory函数和返回引用范围内的所有内容相同:

app.factory('testSO',函数(){
var getSomething=函数(){
log('returngetsomething');
};
...
返回{
getSomething:getSomething,
...
}
现在您可以调用本地函数,如图所示:

app.factory('testSO',函数(){
var getSomething=函数(){
log('returngetsomething');
getData();
};
...
原始服务中有一些重要的东西:
var self=this;
。有些人使用它。这是ECMA中错误的解决方法。 对于原始代码,它用于“将所有内容放在一个对象中”。self中的函数(恰好是函数的属性)需要一个引用来知道您要调用的函数的位置。请在此处亲自尝试我更新了答案,在原始代码中添加了对该问题的快速解释