Подтвердить что ты не робот

Как ввести динамическую зависимость в контроллере $

Я все еще дебютант на 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/

4b9b3361

Ответ 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 динамически вставляет область или контроллер