2015-03-23 2 views
0

У меня есть следующие услуги:Могу ли я вводить зависимости на лету в angular.js?

var module = angular.module('app', []); 

module.service('service', function(dep){ 

}); 

И предположим, что мне нужно создать его экземпляр где-то в моем коде, с другой зависимостью, чем значение по умолчанию.

//service is injected with the default 'dep' dependency 
module.controller('controller', function(service, $injector) { 


    //I need to call the service with my custom dependency 
    //but $injector does not help, because it only gives back 
    //the already injected service object 
    var injectedService = $injector.get('service') 

    //So theoretically I would need something like this 
    //but I did not find such a feature yet 
    var customDep = {...} 
    var serviceWithCustomDep = $injector.inject('service', [customDep]); 
}); 

Есть ли способ достичь этого?

+0

Это звучит, как вы хотите, чтобы определить [поставщик] (https://docs.angularjs.org/guide/providers), который предоставляет методы для горячей замены конфигурации , –

+0

Да, что-то в этом роде. Но я хотел бы сделать это с использованием инъекции зависимостей (не вызывая методы непосредственно у поставщика), потому что мне, возможно, придется делать это с внутренними (предварительно упакованными угловыми) провайдерами, и я не могу их модифицировать. – gsanta

ответ

1

Вкратце: используйте функцию $injector.invoke для вызова функции с введенными зависимостями.

Определите завод (или службу), который будет возвращать функцию, которую вы будете вызывать с помощью зависимостей, которые вы желаете.

module.factory('myFactory', function() { 
    return function() { 
     //do stuff here with dependencies injected 
    }; 
}); 

Затем в контроллере, например:

module.controller('MyController', function (myFactory, $injector) { 
    //define the dependencies you want, for example: 
    myFactory.$inject = ['$http', '$location']; 
    $injector.$invoke(myFactory); 
}); 

Таким образом, вы можете изменить зависимость, с которым вы вызываете функцию myFactory, как вам угодно, вам только нужно изменить $inject свойства функции ,

Вот ссылка с дополнительной информацией: https://docs.angularjs.org/guide/di

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