在我看来,在AngularJS中,服务比工厂更有用;我用对了吗?
我读过很多关于服务和工厂之间的用法和区别的帖子,包括“工厂更复杂”或“你将在80%的时间里使用工厂”或“工厂更有用”,甚至“工厂……使用复杂的创建逻辑”等“服务…使用简单的创建逻辑。我的难题在于,我实际上找到了每种服务的用法 在我看来,服务实际上比工厂能够进行更复杂的操作。下面是一些代码,试图说明我的意思:在我看来,在AngularJS中,服务比工厂更有用;我用对了吗?,angularjs,Angularjs,我读过很多关于服务和工厂之间的用法和区别的帖子,包括“工厂更复杂”或“你将在80%的时间里使用工厂”或“工厂更有用”,甚至“工厂……使用复杂的创建逻辑”等“服务…使用简单的创建逻辑。我的难题在于,我实际上找到了每种服务的用法 在我看来,服务实际上比工厂能够进行更复杂的操作。下面是一些代码,试图说明我的意思: module.service('Record', function (){ this.retrieve = { all: function(){
module.service('Record', function (){
this.retrieve = {
all: function(){
//retrieve all
},
record: function(id){
//retrieve individual record
}
};
this.save = function(){
try{
//save record or throw error
}
catch(e){
//catch block
}
finally{
//non-conditional action
}
};
this.clear = function(){
//clear records
};
this.test = function() {
//function used for testing record retrieval and storage
};
})
注意,为了简单起见,我省略了所有依赖项。我在代码中使用的是一个值服务,它包含应用程序中更新的值,这些值正在本地存储中检索和/或存储
我在想,如果我使用工厂,这个代码的等价物会是什么。我想到了这个:
module.factory('Record', function (){
return {
retrieve: retrieve,
save: save,
clear: clear,
test: test
}
function retrieve(){
this.all = function(){
//retrieve all
}
this.record = function(id){
//retrieve individual record
}
}
function save(){
try{
//save record or throw error
}
catch(e){
//catch block
}
finally{
//non-conditional action
}
}
function clear(){
//clear records
}
function test() {
//function used for testing record retrieval and storage
}
});
问题在于retrieve()函数。其他一切都正常工作,除了现在,我不能像这样从控制器调用retrieve:
Record.retrieve.all();或Record.retrieve.Record(1)
我看不出使用Factory有什么实际优势,尽管我看过所有的例子,也读过所有的东西。因此,我担心我对它的理解不够充分
对于上面的例子,服务似乎是一个更好的选择。有没有人有过这样一个真实的例子:必须使用工厂才能正常工作,而服务却无法正常工作
重新表述这个问题的更好方法是,我如何正确地将上面的代码实现到工厂中?(不为retrieveAll和retrieveRecord创建单独的函数)
谢谢你阅读我的帖子,也谢谢你的见解
检索
不应是函数,而应是对象:
module.factory('Record', function () {
return {
retrieve: {
all: function() {
// retrieve all
},
record: function(id) {
// retrieve individual record
}
},
save: function() {
try {
// save record or throw error
} catch(e) {
// catch block
} finally {
// non-conditional action
}
},
...
}
});
检索
不应是函数,而应是对象:
module.factory('Record', function () {
return {
retrieve: {
all: function() {
// retrieve all
},
record: function(id) {
// retrieve individual record
}
},
save: function() {
try {
// save record or throw error
} catch(e) {
// catch block
} finally {
// non-conditional action
}
},
...
}
});
工厂可用于创建可注入类,而这不能通过服务来实现,因为如果实现返回函数而不是对象文本,则可以使用“
new
”操作符来创建服务的实例(单例)
例如:
module.factory('Monster', function($log){
return function(name, skills) {
this.name = name;
this.skills = skills;
this.sayName = function() {
$log.info('Monster's name is:', this.name);
};
};
});
myapp.controller('MyController' function($scope, Monster){
var m1 = new Monster('Godzilla', ['fire']);
var m2 = new Monster('Gozer');
// do something with your instances...
});
上面使用服务的示例将返回Monster的实例,而不是构造函数 工厂可用于创建可注入类,而这不能通过服务来完成,因为如果实现返回函数而不是对象文本,则使用“
new
”操作符来创建服务的实例(单例)
例如:
module.factory('Monster', function($log){
return function(name, skills) {
this.name = name;
this.skills = skills;
this.sayName = function() {
$log.info('Monster's name is:', this.name);
};
};
});
myapp.controller('MyController' function($scope, Monster){
var m1 = new Monster('Godzilla', ['fire']);
var m2 = new Monster('Gozer');
// do something with your instances...
});
上面使用服务的示例将返回Monster的实例,而不是构造函数 我想那只是我选择哪一个的问题。谢谢你为我们提供了公平的竞争环境!我想那只是我选择哪一个的问题。谢谢你为我们提供了公平的竞争环境!虽然sp00m回答了我前面的问题,但您的回答包含了我感兴趣的“事后”信息。我非常感谢您提供的示例,因为它确实回答了我关于这两项服务之间差异的一个总体问题。虽然sp00m回答了我前面的问题,但您的回答包含了我感兴趣的“事后”信息。我非常感谢您提供的示例,因为它确实回答了我关于这两种服务之间差异的一个总体问题。