我创建了一个AngularJS工厂,我将其重复用于数据访问:
app.factory('abstractFactory3', function ($http) {
function abstractFactory3(odataUrlBase) {
this.odataUrlBase = odataUrlBase;
}
abstractFactory3.prototype = {
getList: function (odataOptions) {
return $http.get(this.odataUrlBase, {
params: odataOptions
});
},
get: function (id, odataOptions) {
return $http.get(this.odataUrlBase + '/' + id, {
params: odataOptions
});
},
insert: function (data) {
return $http.post(this.odataUrlBase, data);
},
update: function (id, data) {
return $http.put(this.odataUrlBase + '(' + id + ')', data);
},
remove: function (id) {
return $http.delete(this.odataUrlBase + '(' + id + ')');
}
};
return abstractFactory3;
});
在differences between Angular services, factories and providers上阅读一篇简短的文章,基于这些定义,我对这个工厂实际上是什么感到困惑。
摘要:
服务:提供函数的实例。
工厂:通过调用传递给module.factory的函数引用返回的值。
提供商:提供ProviderFunction()。$ get()。在调用$ get方法之前实例化构造函数
要使用此工厂,请使用ODada路径初始化:
var dataFactory = new abstractFactory3("/odata/ContentType");
dataFactory.getList(odataParams)
.success(function (result) {
options.success(result);
})
.error (function (error) {
console.log("data error");
});
由于我正在新建abstractFactory3
,我现在提供了一个函数实例(就像一个服务)...初始化为我提供了一个函数实例 - 服务,对吧?但是,通过调用方法.get(), .getList(), .insert(), .update(), .remove()
返回一个值。被认为类似于提供者的ProviderFunction().$get()
?
有人可以澄清一下吗?
答案 0 :(得分:3)
工厂返回调用函数的结果 - 在您的情况下,它只是一个函数。因此,当工厂注入时,它也只是一个功能。这就是为什么你可以新的'注入之后的功能(如您的示例中所示)。你是对的,这基本上就是服务。
不,提供者。$ get与调用.getList(),。insert()等类似.provider。$ get的结果是$ injector注入的内容。对于工厂来说,它是调用工厂功能的结果。对于服务,它是新服务的构造函数的结果。
提供者。$ get更灵活 - 它可以返回任何你想要的东西(这意味着你可以注入你想要的任何东西)。
答案 1 :(得分:0)
提供商,工厂,服务似乎比实际上更复杂。每个都是另一个的专用版本,如果满足您的需要,您可以用更少的代码完成同样的事情。
例如,如果你要返回的只是数字或字符串的字面值,你可以使用值并在一行代码中完成。您也可以使用工厂进行链接,但您可以编写更少的代码。
另一方面,如果想根据从服务器获得的另一个值计算值。那么你不能用价值来做到这一点,因此你必须在一个工厂上升一级。
依此类推依赖链条。以下博客文章详细介绍了该文章,并提供了几个示例:
以下是来自同一篇文章的高级图片,说明了我上面所说的内容: