2013-03-08 116 views
30

我對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; 
    } 

回答

21

ExtendedService應注入BasicService爲了能夠訪問它。除此之外,BasicService是一個對象字面量,因此您不能將其實際稱爲函數(BasicService())。

.factory('ExtendedService', function($http, BasicService){ 
    BasicService['method_four'] = function(){}; 
    return BasicService; 
} 
+0

完美的感謝,絕對是我一直在尋找。 – Amyth 2013-03-19 13:55:08

+0

如果我們認爲BasicService是抽象的,我是否認爲這是最好的方法?因爲那樣我們就永遠不會真的使用BasicService,只有擴展服務,所以文學擴展它沒有問題。 – Floris 2015-07-14 14:04:37

+0

這個方法真的好嗎?鑑於服務是單身人士,這意味着BasicService上的更改將是永久性的,所以BasicService也將被更改。創建BasicService的副本並返回該副本的擴展版本不是更好嗎? – Razvan 2016-02-05 11:21:28

3

對不起,如果我張貼在這裏,但可能是它的一個好地方。 我指的是這個post

要當心,因爲是單身 這樣你就可以一次延伸服務/工廠,延伸服務/工廠。

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

它的工作原理

+1

很好的說明,但angular.extend()通過製作服務的副本來以更簡單的方式照顧它。 – Alkaline 2014-08-28 11:30:14

68

更清潔和必要的方式

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

    var extended = angular.extend(BasicService, {}) 
    extended.method = function() { 
     // ... 
    } 
    return extended; 
} 
+10

我認爲最好擴展空對象而不是原始服務:'var extended = angular.extend({},BasicService)''。'copy'將創建新的實例,而不是使用它的淺拷貝來擴展 – havenchyk 2014-11-24 08:04:44

+0

完美!非常乾淨... – 2015-01-28 17:29:50

16

在我看來,一個更好的辦法:

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

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

    return service; 
}); 

這裏至少不會更改繼承的服務。

+0

我同意,使用copy()會更有意義,因爲您不會更改繼承的服務。 – 2016-08-31 20:58:03

-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(){ 

    } 
} 

這有原來的服務是不會改變的好處,同時保持它的功能。您也可以選擇在ExtendedService中爲BasicService中的其他3種方法使用自己的實現。

+0

不是海報,但有人可以解釋爲什麼這個解決方案downvoted?我看起來很好。 – Floris 2015-07-14 14:00:00

+0

看來,這篇文章是downvoted,因爲你需要列出你從父對象得到的方法和字段。由於某些原因,這是不好的做法。從技術上講,這不是純粹的繼承。 – 2015-07-22 11:06:02