Инъекционные зависимости в конфигурационных() модулях - AngularJS
В настоящее время в app.js у меня есть следующие маршруты:
var gm = angular.module('gm', ['gm.services','gm.directives','gm.filters','gm.controllers','ngSanitize']);
gm.config(['$routeProvider', 'Path', function($routeProvider, Path) {
$routeProvider.when('/login', {
templateUrl: Path.view('application/authentication/login.html'),
controller: 'authController'
});
$routeProvider.when('/dashboard', {
templateUrl: Path.view('application/dashboard/index.html'),
controller: 'dashboardController'
});
$routeProvider.otherwise({
redirectTo: '/login'
});
}]);
Я пытаюсь внедрить зависимость Path, как вы можете видеть. Хотя я получаю сообщение о том, что не могу найти этого провайдера. Я думаю, что это потому, что поставщики конфигурационных модулей выполняются в первую очередь, прежде чем что-либо еще. ниже мое определение поставщика пути в "services.js"
gm.factory("Path", function() {
return {
view: function(path) {
return 'app/views/' + path;
},
css: function(path) {
return 'app/views/' + path;
},
font: function(path) {
return 'app/views/' + path;
},
img: function(path) {
return 'app/views/' + path;
},
js: function(path) {
return 'app/views/' + path;
},
vendor: function(path) {
return 'app/views/' + path;
},
base: function(path) {
return '/' + path;
}
}
});
Как я могу ввести этот провайдер в модуль конфигурации?
Ответы
Ответ 1
В .config
вы можете использовать только поставщиков (например, $routeProvider
). в .run
вы можете использовать только экземпляры служб (например, $route
). У вас есть factory, а не поставщик. Смотрите этот фрагмент с тремя способами создания этого: Сервис, Factory и поставщик
Они также упоминают об этом в документах angular https://docs.angularjs.org/guide/services
Ответ 2
- angular.config принимает только поставщиков
- каждая служба, factory и т.д. являются экземплярами поставщика
Чтобы внедрить сервис в конфигурацию, вам просто нужно позвонить поставщику услуги, добавив к нему имя "Provider".
angular.module('myApp')
.service('FooService', function(){
//...etc
})
.config(function(FooServiceProvider){
//...etc
});
В соответствии с angularjs Provider документация
... если вы определяете рецепт factory, пустующий тип провайдера с методом $get, установленным в вашу функцию factory, автоматически создается под капотом.
Итак, если у вас есть factory (или услуга), например:
.factory('myConfig', function(){
return {
hello: function(msg){
console.log('hello ' + msg)
}
}
})
Сначала вам нужно вызвать ваш factory с помощью метода $get перед обращением к возвращенному объекту:
.config(function(myConfigProvider){
myConfigProvider
.$get()
.hello('world');
});
Ответ 3
Вы должны использовать константу для этого, потому что это единственное, что вы можете ввести в фазе конфигурации, отличной от поставщиков.
angular.module("yourModule").constant("paths", {
base: function(){ ... }
});
Ответ 4
Это обсуждение помогло мне, когда я пытался выяснить то же самое, в основном
$routeProvider.when('/', {
templateUrl:'views/main.html',
controller:'MainController',
resolve: {
recentPosts: ['$q', 'backendService', function($q, backendService){
var deferred = $q.defer();
backendService.getRecentPosts().then(
function(data) {
var result = data.result;
deferred.resolve(result);
},
function(error) {
deferred.reject(error);
}
);
return deferred.promise;
}]
}
})