我该如何扩展服务

Amy*_*yth 32 javascript angularjs

我相当新,angularjs并且无法找到任何文档或示例.我要做的是扩展基本服务,以便我可以使用其他服务的基本服务定义的方法.例如,假设我有如下基本服务.

angular.module('myServices', []).

    factory('BasicService', function($http){
        var some_arg = 'abcd'
        var BasicService = {
            method_one: function(arg=some_arg){ /*code for method one*/},
            method_two: function(arg=some_arg){ /*code for method two*/},
            method_three: function(arg=some_arg){ /*code for method three*/},
        });
        return BasicService;
    }   
);
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个从上面扩展的扩展服务,BasicService以便我可以使用我的扩展服务在BasicService下定义的方法.也许是这样的:

    factory('ExtendedService', function($http){
        var ExtendedService = BasicService();
        ExtendedService['method_four'] = function(){/* code for method four */}
        return ExtendedService;
    }
Run Code Online (Sandbox Code Playgroud)

S.C*_*.C. 69

更清洁和势在必行的方式

.factory('ExtendedService', function($http, BasicService){

    var extended = angular.extend(BasicService, {})
    extended.method = function() {
        // ...
    }
    return extended;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为扩展空对象而不是原始服务更好:`var extended = angular.extend({},BasicService)`.同样`copy`将创建新实例,而不是使用它的浅拷贝进行扩展 (10认同)

Ste*_*wie 22

ExtendedService应该注入BasicService,以便能够访问它.除此之外BasicService是对象文字,因此您实际上不能将其称为function(BasicService()).

.factory('ExtendedService', function($http, BasicService){
  BasicService['method_four'] = function(){};
  return BasicService;
}
Run Code Online (Sandbox Code Playgroud)


Vit*_*kov 18

在我看来,更好的方法:

.factory('ExtendedService', function($http, BasicService){
    var service = angular.copy(BasicService);

    service.methodFour = function(){
        //code for method four
    };

    return service;
});
Run Code Online (Sandbox Code Playgroud)

这里至少不会改变继承的服务.