33

私はかなり新しいので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;
    }   
);

ここで、上記から拡張された拡張サービスを定義して、拡張サービスBasicServiceからBasicServiceで定義されたメソッドを使用できるようにします。多分次のようなものです:

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

6 に答える 6

69

よりクリーンで必須の方法

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

    var extended = angular.extend(BasicService, {})
    extended.method = function() {
        // ...
    }
    return extended;
}
于 2014-02-02T16:30:50.093 に答える
23

アクセスできるようにするには、ExtendedServiceを注入する必要があります。BasicServiceその横にBasicServiceはオブジェクトリテラルがあるため、実際に関数()として呼び出すことはできませんBasicService()

.factory('ExtendedService', function($http, BasicService){
  BasicService['method_four'] = function(){};
  return BasicService;
}
于 2013-03-08T12:47:26.960 に答える
18

私の意見では、より良い方法:

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

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

    return service;
});

ここでは、少なくとも継承されたサービスは変更されません。

于 2014-06-26T06:15:00.670 に答える
3

ここに投稿してすみませんが、それを行うには良い場所かもしれません。この投稿を参照します

シングルトンであるため、サービス/ファクトリを拡張する場合は注意してください。サービス/ファクトリを一度拡張できます。

'use strict';
            angular.module('animal', [])
                .factory('Animal',function(){
                        return {
                            vocalization:'',
                            vocalize : function () {
                                console.log('vocalize: ' + this.vocalization);
                            }
                        }

                });
                angular.module('dog', ['animal'])
                    .factory('Dog', function (Animal) {
                        Animal.vocalization = 'bark bark!';
                        Animal.color = 'red';
                        return Animal;
                    });

                angular.module('cat', ['animal'])
                   .factory('Cat', function (Animal) {
                        Animal.vocalization = 'meowwww';
                        Animal.color = 'white';
                        return Animal;
                    });
                 angular.module('app', ['dog','cat'])
                .controller('MainCtrl',function($scope,Cat,Dog){
                     $scope.cat = Cat;
                     $scope.dog = Dog;
                     console.log($scope.cat);
                     console.log($scope.dog);
                    //$scope.cat = Cat;
                });

しかし、あなたが好きなら

'use strict';
            angular.module('animal', [])
                .factory('Animal',function(){
                    return function(vocalization){
                        return {
                            vocalization:vocalization,
                            vocalize : function () {
                                console.log('vocalize: ' + this.vocalization);
                            }
                        }
                    }
                });    
                angular.module('app', ['animal'])
                    .factory('Dog', function (Animal) {
                        function ngDog(){
                            this.prop = 'my prop 1';
                            this.myMethod = function(){
                                console.log('test 1');
                            }
                        }
                        return angular.extend(Animal('bark bark!'), new ngDog());
                    })
                    .factory('Cat', function (Animal) {
                        function ngCat(){
                            this.prop = 'my prop 2';
                            this.myMethod = function(){
                                console.log('test 2');
                            }
                        }
                        return angular.extend(Animal('meooow'), new ngCat());
                    })
                .controller('MainCtrl',function($scope,Cat,Dog){
                     $scope.cat = Cat;
                     $scope.dog = Dog;
                     console.log($scope.cat);
                     console.log($scope.dog);
                    //$scope.cat = Cat;
                });

できます

于 2014-02-01T20:41:11.087 に答える
1

私はBackboneのextendを内部で使用する$extendプロバイダーを作成しました-したがって、必要に応じてプロトタイプと静的プロパティの両方を拡張できます-さらに、親/子コンストラクターを取得します-gist@https://gist.githubを参照してください.com / asafebgi / 5fabc708356ea4271f51

于 2015-03-20T09:09:43.223 に答える
-1

Stewieの答えを拡張するには、次のようにすることもできます。

.factory('ExtendedService', function($http, BasicService){
    var service = {
        method_one: BasicService.method_one,
        method_two: BasicService.method_two,
        method_three: BasicService.method_three,
        method_four: method_four
    });

    return service ;

    function method_four(){

    }
}

これには、元のサービスが機能を維持しながら変更されないという利点があります。BasicServiceの他の3つのメソッドには、ExtendedServiceで独自の実装を使用することもできます。

于 2014-08-22T11:53:15.807 に答える