Как я могу продлить службу
Я новичок в 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;
}
Ответы
Ответ 1
Ваш ExtendedService
должен ввести BasicService
, чтобы иметь доступ к нему. Кроме того, BasicService
является литералом объекта, поэтому вы не можете называть его функцией (BasicService()
).
.factory('ExtendedService', function($http, BasicService){
BasicService['method_four'] = function(){};
return BasicService;
}
Ответ 2
Более чистый и императивный способ
.factory('ExtendedService', function($http, BasicService){
var extended = angular.extend(BasicService, {})
extended.method = function() {
// ...
}
return extended;
}
Ответ 3
По-моему, лучший способ:
.factory('ExtendedService', function($http, BasicService){
var service = angular.copy(BasicService);
service.methodFour = function(){
//code for method four
};
return service;
});
Здесь, по крайней мере, не изменяется унаследованная услуга.
Ответ 4
Извините, если я опубликую здесь, но, возможно, это хорошее место для этого.
Я ссылаюсь на сообщение
следить за продлением службы /factory, потому что это singleton
поэтому вы можете продлить службу / factory один раз.
'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;
});
работает
Ответ 5
Я написал провайдера $extend, который использует Backbone для расширения под капотом. Таким образом, вы получаете как прототип, так и статическое свойство, расширяющееся в случае, если они вам нужны. Плюс вы получаете родительские/дочерние конструкторы - см. gist @https://gist.github.com/asafebgi/5fabc708356ea4271f51
Ответ 6
Чтобы расширить ответ на 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 для других 3 методов из BasicService.