Использование решения в $routeProvider вызывает "Неизвестный поставщик..."
СМОТРЕТЬ РЕШЕНИЕ В НОМЕРЕ ЭТОГО ПОЧТА
Я пытаюсь выполнить асинхронный HTTP-запрос для загрузки некоторых данных до загрузки приложения, поэтому я использую решение в $routeProvider, которое является HTTP-запросом в моем MainController. По какой-то причине я продолжаю получать Ошибка: [$ injector: unpr] Неизвестный поставщик: appDataProvider < - appDatastrong > , где appData - это место, где я выполняю свой HTTP-запрос. Я использую AngularJS v 1.2.5.
Вот код и два метода, которые я пробовал, оба они дают ту же ошибку:
Метод # 1
MainController.js
var MainController = ['$scope','$location','appData',
function($scope, $location, appData){
console.log(appData.data);
}
];
MainController.loadData = {
appData: function($http, $location, MainFactory){
var aid = MainFactory.extractAid($location);
return $http({method: 'GET', url: URL_CONST + aid});
}
};
app.js
var app = angular.module('HAY', ['ngRoute']);
app.config(function($routeProvider) {
$routeProvider
.when('/', {
redirectTo: '/pages/alerts'
})
.when('/pages/:pageName', {
templateUrl: function(params) {
return 'views/pages/' + params.pageName + '.html';
},
controller: MainController,
resolve: MainController.loadData
})
.otherwise({
redirectTo: '/pages/alerts'
});
});
Я попытался изменить имя на случай, если это ключевое слово с конфликтующей системой, но без везения. По какой-то причине appDatastrong > никогда не распознается
Метод №2
Я также попытался изменить его так:
app.js
var app = angular.module('HEY', ['ngRoute']);
app.config(function($routeProvider) {
$routeProvider
.when('/', {
redirectTo: '/pages/alerts'
})
.when('/pages/:pageName', {
templateUrl: function(params) {
return 'views/pages/' + params.pageName + '.html';
},
controller: MainController,
resolve: {
appData: ['$http', '$location','MainFactory', function($http, $location, MainFactory) {
var aid = MainFactory.extractAid($location);
return $http({method: 'GET', url: URL_CONST + aid});
}]
}
})
.otherwise({
redirectTo: '/pages/alerts'
});
});
MainController.js
var MainController = ['$scope','$location','appData',
function($scope, $location, appData){
console.log(resolvedData);
}
];
Однако результат был точно таким же. Связано ли это с angular 1.2.5?
Вот рабочая версия от кого-то другого
http://mhevery.github.io/angular-phonecat/app/#/phones
И вот код:
function PhoneListCtrl($scope, phones) {
$scope.phones = phones;
$scope.orderProp = 'age';
}
PhoneListCtrl.resolve = {
phones: function(Phone) {
return Phone.query();
},
delay: function($q, $defer) {
var delay = $q.defer();
$defer(delay.resolve, 1000);
return delay.promise;
}
}
angular.module('phonecat', ['phonecatFilters', 'phonecatServices', 'phonecatDirectives']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl, resolve: PhoneListCtrl.resolve}).
otherwise({redirectTo: '/phones'});
}]);
РЕШЕНИЕ:
Проблема была НЕ из-за использования ранее используемой версии AngularJS.
Вот исправления с использованием кода, который у меня выше.
-
В app.js вам нужно объявить контроллер как контроллер :
"MainController" и НЕ как контроллер: MainController даже
хотя у вас есть var MainController = app.controller('MainController',
....).
-
Вторая и самая большая вещь в том, что в моем index.html я объявил свой
контроллер уже такой:
index.html
body ng-app = "HEY" controller = "MainController" /body
Это вызвало ошибку Неизвестного поставщика. По-видимому, angular не скажет вам, что вы уже заявили, что контроллер, который вы используете для разрешения, и что это приведет к странной ошибке, не имеют никакого отношения к решению.
Я надеюсь, что это поможет кому-то, у кого может быть такая же проблема.
Ответы
Ответ 1
Вот пример кода, который я использовал в приложении, над которым я работаю, но не уверен, что он многое поможет, потому что он не сильно отличается от того, как у вас уже есть.
Routing
.when('/view/proposal/:id',{
controller : 'viewProposalCtrl',
templateURL : 'tmpls/get/proposal/view',
resolve : viewProposalCtrl.resolveViewProposal
})
контроллер
var viewProposalCtrl = angular.module('proposal.controllers')
.controller('viewProposalCtrl',['$scope','contacts','details','rationale',
function($scope,contacts,details,rationale){
$scope.contacts = contacts;
$scope.details = details;
$scope.rationale = rationale;
// [ REST OF CONTROLLER CODE ]
});
// proposalSrv is a factory service
viewProposalCtrl.resolveViewProposal = {
contacts : ['$route','proposalSrv',function($route,proposalSrv){
return proposalSrv.get('Contacts',$route.current.params.id)
.then(function(data){
return data.data.contacts;
},function(){
return [];
});
}],
details : ['$route','proposalSrv',function($route,proposalSrv){
return proposalSrv.get('Details',$route.current.params.id)
.then(function(data){
return data.data.details;
},function(){
return {};
});
}],
rationale : ['$route','proposalSrv',function($route,proposalSrv){
return proposalSrv.get('Rationale',$route.current.params.id)
.then(function(data){
return data.data.rationale;
},function(){
return {};
]
}]
};
Теперь, когда я размышлял над этим, когда я разрабатывал свое приложение, у меня была проблема, и я не уверен, почему, когда я назвал функцию разрешения "разрешить". Это дало мне проблему:
.when('/path',{
// stuff here
resolve : myCtrlr.resolve
})
но это не так:
.when('/path',{
//stuff here
resolve : myCtrlr.myResolveFn
})
Другая возможность
Единственное, что я могу придумать, это то, что вы возвращаете обещание из вызова $http
, а затем пытаетесь использовать appData.data
Попробуйте использовать функцию .then
или одну других функций (.success
, .error
) для извлечения информации из обещания.
Ответ 2
Одна вещь, которую я заметил в angular 1x docs, состоит в том, что ВЫ НЕ УКАЗАНЫ РЕШЕННЫЙ ПАРАМЕТР КАК АННОТИРОВАННАЯ ЗАВИСИМОСТЬ
Итак, это:
.when('/somewhere', {
template: '<some-component></some-component>',
resolve: {
resolvedFromRouter: () => someService.fetch()
}
})
export default [
'$scope',
'someService',
'resolvedFromRouter'
Controller
]
function Controller($scope, someService, resolvedFromRouter) {
// <= unknown provider "resolvedFromRouter"
}
неверно. Вы не указываете разрешенный параметр как зависимость, в документах:
Для облегчения доступа к разрешенным зависимостям из шаблона карта разрешений будет доступна в области маршрута под $разрешением (по умолчанию) или настраиваемым именем, указанным свойством resolveAs (см. ниже). Это может быть особенно полезно при работе с компонентами в качестве шаблонов маршрутов.
Так просто сделайте это вместо:
.when('/somewhere', {
template: '<some-component></some-component>',
resolve: {
resolvedFromRouter: () => someService.fetch()
}
})
export default [
'$scope',
'someService',
Controller
]
function Controller($scope, someService) {
$scope.$resolve.resolvedFromRouter; // <= injected here
}