Как ввести динамическую зависимость в контроллере $
Я все еще дебютант на Angularjs.
Я хочу динамически вводить зависимость службы (которую я создал) в моем контроллере.
Но когда я кодирую службу с зависимостями, я получил эту ошибку:
Ошибка: Неизвестный поставщик: $windowProvider < - $window < - base64
Это код контроллера.
var base64 = angular.injector(['servicesModule']).get('base64');
console.log("base64", base64.encode("my text will be encoded"));
Этот код работает:
var servicesModule = angular.module('servicesModule', []);
servicesModule.factory('base64', function() {
return {
name: 'base64',
readonly: false,
encode: function(input) {
return window.btoa(input);
},
decode: function(input) {
return window.atob(input);
}
};
});
Этот код не работает:
var extModule = angular.module('ext', []);
extModule.factory('base64', ['$window', function($window) {
return {
name: 'base64',
readonly: false,
encode: function(input) {
return $window.btoa(input);
},
decode: function(input) {
return $window.atob(input);
}
};
}]);
Другая проблема заключается в том, что служба находится в том же модуле, что и контроллер.
Если у модуля есть зависимости, я не работаю (у меня есть зависимость routeProvider в моей конфигурации модуля):
Ошибка: Неизвестный поставщик: $routeProvider из mainModule
var mainModule = angular.module('main', [],
function($routeProvider, $locationProvider) {
//Some routing code
}
);
JS Fiddles
Тот же модуль с зависимостями (контроллер + служба): http://jsfiddle.net/yrezgui/YedT2/
Различные модули с зависимостями: http://jsfiddle.net/yrezgui/YedT2/4/
Различные модули без зависимостей: http://jsfiddle.net/yrezgui/YedT2/5/
Ответы
Ответ 1
Не вызывайте angular.injector() - это создает новый инжектор. Вместо этого добавьте уже созданный $injector
в свой контроллер и используйте его:
Итак, вместо:
var algoController = function($scope) {
$scope.base64 = angular.injector(['main']).get('base64');
};
Сделайте это:
var algoController = function($scope, $injector) {
$scope.base64 = $injector.get('base64');
};
Но большую часть времени вы должны вводить свои услуги напрямую, а не динамически, например:
var algoController = function($scope, base64) {
$scope.base64 = base64;
};
См. также AngularJS динамически вставляет область или контроллер