这是一个伪装成工厂的AngularJS服务吗?

时间:2014-02-26 08:32:59

标签: javascript jquery angularjs http angularjs-service

我创建了一个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()

有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:3)

工厂返回调用函数的结果 - 在您的情况下,它只是一个函数。因此,当工厂注入时,它也只是一个功能。这就是为什么你可以新的'注入之后的功能(如您的示例中所示)。你是对的,这基本上就是服务。

不,提供者。$ get与调用.getList(),。insert()等类似.provider。$ get的结果是$ injector注入的内容。对于工厂来说,它是调用工厂功能的结果。对于服务,它是新服务的构造函数的结果。

提供者。$ get更灵活 - 它可以返回任何你想要的东西(这意味着你可以注入你想要的任何东西)。

答案 1 :(得分:0)

提供商,工厂,服务似乎比实际上更复杂。每个都是另一个的专用版本,如果满足您的需要,您可以用更少的代码完成同样的事情。

例如,如果你要返回的只是数字或字符串的字面值,你可以使用值并在一行代码中完成。您也可以使用工厂进行链接,但您可以编写更少的代码。

另一方面,如果想根据从服务器获得的另一个值计算值。那么你不能用价值来做到这一点,因此你必须在一个工厂上升一级。

依此类推依赖链条。以下博客文章详细介绍了该文章,并提供了几个示例:

http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/

以下是来自同一篇文章的高级图片,说明了我上面所说的内容:

Providers, services, factories are all the same in AngularJS