如何创建一个角度JS服务,是不是单身? [英] How can I create an angular JS service that isn't a singleton?

查看:83
本文介绍了如何创建一个角度JS服务,是不是单身?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于每一个服务是一个单。 &安培;调用$ injector.get()仍然给我相同的实例每次。

我如何使用服务的多个实例的另一个服务里面呢?请记住,我的非单身类的声明,不得污染全局命名空间等。

我的例子如下:(这里我想$ injector.get('serviceCall')是一个不同的实例每次,但因为我已经发现它不能

  app.factory('reportsService',['$喷油器'功能($喷油器){
    VAR O = {};
    o.getServiceCall =功能(){
        返回$ injector.get('serviceCall');
    };
    o.getOriginCompositionData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestOriginComposition';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    o.getExeuctionTimeData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestExeuctionTime';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    o.getCacheCompositionData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestCacheComposition';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    返回O;
}]);

和我serviceCall服务:

  app.factory('serviceCall',函数(){
    VAR O = {};
    o.initialize =功能(USEROPTIONS){
        o.options = o.getOptions(USEROPTIONS);
        o.call();
    };
    o.getOptions =功能(USEROPTIONS){
        VAR defaultOptions = {
            动作:'后',
            网址:'',// USEROPTIONS
            successCallback:'',// USEROPTIONS
            errorCallback:'',// USEROPTIONS
            数据类型:JSON
        };
        VAR的选择= $ .extend(defaultOptions,USEROPTIONS);
        返回选项;
    };
    o.call =功能(){
        $阿贾克斯({
            类型:o.options.action,
            网址:o.options.url,
            数据:o.options.data,
            成功:函数(R){
                o.options.successCallback(R);
            },
            错误:功能(XHR,textStatus,errorThrown){
                //去做
            },
            数据类型:o.options.dataType,
            的contentType:o.options.contentType
        });
    };
    返回O;
});


解决方案

同意@eddiec。

问题是,当你是新来的角度,你觉得工厂就像是设计模式工厂:在每个调用提供了一个新的实例的功能。然而,工厂的角度实际上是一个被调用一次函数返回将缓存的对象。现在,你每次DI与工厂的名字,这个对象将被注入,而不是工厂的功能。

所以,如果你想有一个真实(设计模式)工厂,您需要创建一个返回新对象的函数。

下面是一个快速实施

  app.factory('serviceCallFactory',函数(){    函数O(){
        VAR O = {};
        o.initialize =功能(USEROPTIONS){
            o.options = o.getOptions(USEROPTIONS);
            o.call();
        };
        o.getOptions =功能(USEROPTIONS){
            VAR defaultOptions = {
                动作:'后',
                网址:'',// USEROPTIONS
                successCallback:'',// USEROPTIONS
                errorCallback:'',// USEROPTIONS
                数据类型:JSON
            };
            VAR的选择= $ .extend(defaultOptions,USEROPTIONS);
            返回选项;
        };
        o.call =功能(){
            $阿贾克斯({
                类型:o.options.action,
                网址:o.options.url,
                数据:o.options.data,
                成功:函数(R){
                    o.options.successCallback(R);
                },
                错误:功能(XHR,textStatus,errorThrown){
                    //去做
                },
                数据类型:o.options.dataType,
                的contentType:o.options.contentType
            });
        };
        返回O;
    }    返回{
        创建:函数(){
            返回新O();
        }
    }});
app.factory('reportsService',['serviceCallFactory',函数(serviceCallFactory){
    VAR O = {};
    o.getServiceCall =功能(){
        返回serviceCallFactory.create();
    };
    o.getOriginCompositionData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestOriginComposition';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    o.getExeuctionTimeData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestExeuctionTime';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    o.getCacheCompositionData =功能(ajaxOptions){
        ajaxOptions.url ='/测试/ SpiderRequestCacheComposition';
        。o.getServiceCall()初始化(ajaxOptions);
    };
    返回O;
}]);

Because every service is a singleton. & calling $injector.get() still gives me the same instance everytime.

How can I use multiple instances of a service inside another service? Keeping in mind that the declaration of my non-singleton class, must not pollute the global namespace etc.

My example is below: (Where I wanted $injector.get('serviceCall') to be a different instance everytime, but I've since discovered it can't be.

app.factory('reportsService', ['$injector', function ($injector) {
    var o = {};
    o.getServiceCall = function () {
        return $injector.get('serviceCall');
    };
    o.getOriginCompositionData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestOriginComposition';
        o.getServiceCall().initialize(ajaxOptions);
    };
    o.getExeuctionTimeData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestExeuctionTime';
        o.getServiceCall().initialize(ajaxOptions);
    };
    o.getCacheCompositionData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestCacheComposition';
        o.getServiceCall().initialize(ajaxOptions);
    };
    return o;
}]);

and my serviceCall Service:

app.factory('serviceCall', function () {
    var o = {};
    o.initialize = function (userOptions) {
        o.options = o.getOptions(userOptions);
        o.call();
    };
    o.getOptions = function (userOptions) {
        var defaultOptions = {
            action: 'post',
            url: '', //userOptions
            successCallback: '', //userOptions
            errorCallback: '', //userOptions
            dataType: 'json'
        };
        var options = $.extend(defaultOptions, userOptions);
        return options;
    };
    o.call = function () {
        $.ajax({
            type: o.options.action,
            url: o.options.url,
            data: o.options.data,
            success: function (r) {
                o.options.successCallback(r);
            },
            error: function (xhr, textStatus, errorThrown) {
                //TODO
            },
            dataType: o.options.dataType,
            contentType: o.options.contentType
        });
    };
    return o;
});

解决方案

Agree with @eddiec.

The thing is, when you're new to angular, you suppose factory is like the design pattern Factory : a function that provides a new instance at each call. However, 'factory' in angular is actually a function that is called only one time and that returns an object that will be "cached". Now, every time you DI with the factory name, this object will be injected, not the factory function.

So, if you want a "real" (the design pattern) Factory, you need to create a function that returns a new object.

Here is a quick implementation

app.factory('serviceCallFactory', function () {

    function o() {
        var o = {};
        o.initialize = function (userOptions) {
            o.options = o.getOptions(userOptions);
            o.call();
        };
        o.getOptions = function (userOptions) {
            var defaultOptions = {
                action: 'post',
                url: '', //userOptions
                successCallback: '', //userOptions
                errorCallback: '', //userOptions
                dataType: 'json'
            };
            var options = $.extend(defaultOptions, userOptions);
            return options;
        };
        o.call = function () {
            $.ajax({
                type: o.options.action,
                url: o.options.url,
                data: o.options.data,
                success: function (r) {
                    o.options.successCallback(r);
                },
                error: function (xhr, textStatus, errorThrown) {
                    //TODO
                },
                dataType: o.options.dataType,
                contentType: o.options.contentType
            });
        };
        return o;
    }

    return {
        create : function () {
            return new o();
        }
    }

});


app.factory('reportsService', ['serviceCallFactory', function (serviceCallFactory) {
    var o = {};
    o.getServiceCall = function () {
        return serviceCallFactory.create();
    };
    o.getOriginCompositionData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestOriginComposition';
        o.getServiceCall().initialize(ajaxOptions);
    };
    o.getExeuctionTimeData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestExeuctionTime';
        o.getServiceCall().initialize(ajaxOptions);
    };
    o.getCacheCompositionData = function (ajaxOptions) {
        ajaxOptions.url = '/test/SpiderRequestCacheComposition';
        o.getServiceCall().initialize(ajaxOptions);
    };
    return o;
}]);

这篇关于如何创建一个角度JS服务,是不是单身?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆