2013-12-02 2 views
3

Поскольку каждый сервис является одноточечным. & вызов $ injector.get() все равно дает мне тот же экземпляр каждый раз.Как создать угловую службу JS, которая не является одиночной?

Как я могу использовать несколько экземпляров службы внутри другой службы? Помня о том, что объявление моего не-одиночного класса не должно загрязнять глобальное пространство имен и т. Д.

Мой пример ниже: (Где бы я хотел, чтобы $ injector.get ('serviceCall') был другим экземпляром каждый раз, но я с тех пор обнаружил, что это не может быть

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; 
}]); 

и мой serviceCall услуги:.

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; 
}); 

ответ

3

Согласен с @eddiec.

Дело в том, что когда вы новичок в угловом, вы полагаете, что фабрика похожа на шаблон дизайна Factory: функция, которая предоставляет новый экземпляр при каждом вызове. Однако «фабрика» в угловом режиме является фактически функцией, которая называется только один раз и возвращает объект, который будет «кэшироваться». Теперь, каждый раз, когда вы DI с заводским именем, этот объект будет введен, а не заводская функция.

Итак, если вы хотите создать «реальный» (шаблон дизайна) Factory, вам нужно создать функцию, которая возвращает новый объект.

Вот быстрое внедрение

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; 
}]); 
5

Вам нужно реализовать шаблон фабрики Возвращайтесь службу, которая создает экземпляры объектов для вас. . $injector.get('serviceCall') всегда будет возвращать синглтон, но re ничего не мешает вам сделать работу синглтона, создавая для вас новые экземпляры объектов.

Вместо того, чтобы использовать $ injector, непосредственно DI serviceCallFactory, и вызывать методы для создания новых экземпляров serviceCall.

Смежные вопросы