J'essaie de faire une demande http asynchrone pour charger des données avant le chargement de mon application et j'utilise donc une résolution dans $ routeProvider qui est une demande http dans mon MainController. Pour une raison quelconque, je continue à avoir Erreur: [$ injector: UNN] fournisseur inconnu: appDataProvider <- appData où appData est l'endroit où je fais ma demande http. J'utilise AngularJS v 1.2.5.
Voici le code et deux méthodes que j'ai essayées qui donnent la même erreur:
Méthode n ° 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'
});
});
J'ai essayé de changer le nom au cas où il s'agirait d'un mot clé réservé au système en conflit, mais sans succès. Pour une raison quelconque, appData n'est jamais reconnu
Méthode n ° 2 J'ai aussi essayé de le changer comme suit:
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);
}
];
Cependant, le résultat était exactement le même. Est-ce que cela a quelque chose à voir avec angular 1.2.5?
Voici une version de travail de quelqu'un d'autre
http://mhevery.github.io/angular-phonecat/app/#/phones
Et voici le code:
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'});
}]);
Le problème étaitPASen raison de l'utilisation antérieure d'une version différente d'AngularJS.
Voici les correctifs en utilisant le code que j'ai ci-dessus.
Dans app.js, vous devez déclarer le contrôleur en tant que controller: 'MainController' et NOT en tant que controller: MainController même si vous avez var MainController = app.controller ('MainController', ....).
La deuxième et plus importante chose est que, dans mon index.html, j'ai déjà déclaré mon contrôleur comme suit:
index.html
body ng-app = "HEY" controller = "MainController"/body
Cela causait toute l'erreur du fournisseur inconnu. Apparemment, angular ne vous dira pas que vous avez déjà déclaré le contrôleur que vous utilisez pour le résoudre et que cela provoquerait une erreur étrange qui n'aurait aucun rapport avec la résolution.
J'espère que cela aide quelqu'un qui peut avoir le même problème.
Voici un exemple du code que j'ai utilisé dans l'application sur laquelle je travaille. Je ne suis pas sûr que cela aidera beaucoup, car ce n'est pas très différent de la façon dont vous l'avez déjà.
Routing
.when('/view/proposal/:id',{
controller : 'viewProposalCtrl',
templateURL : 'tmpls/get/proposal/view',
resolve : viewProposalCtrl.resolveViewProposal
})
Manette
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 {};
]
}]
};
Maintenant que j'y réfléchis, lors du développement de mon application, j'avais un problème et je ne savais pas pourquoi quand j'ai nommé ma fonction de résolution «résoudre». Cela m'a donné un problème:
.when('/path',{
// stuff here
resolve : myCtrlr.resolve
})
mais cela n'a pas:
.when('/path',{
//stuff here
resolve : myCtrlr.myResolveFn
})
Une autre possibilité
La seule autre chose à laquelle je peux penser est que vous renvoyez le promise de l'appel $http
et essayez ensuite d'utiliser appData.data
Essayez d'utiliser la fonction .then
ou l'une des autres fonctions (.success
, .error
) informations de la promesse.
Une chose que j’ai remarquée dans les documents angulaires 1x est que VOUS NE SPÉCIFIEZ PAS LE PARAMÈTRE RÉSOLU COMME UNE DÉPENDANCE ANNOTÉE
Donc ça:
.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"
}
est faux. Vous ne spécifiez pas le paramètre résolu comme dépendance, dans la documentation:
Pour faciliter l'accès aux dépendances résolues à partir du modèle, la carte de résolution sera disponible dans l'étendue de la route, sous $ resol (par défaut) ou sous un nom personnalisé spécifié par la propriété resolAs (voir ci-dessous). Cela peut être particulièrement utile lorsque vous utilisez des composants en tant que modèles de route.
Donc, faites ceci à la place:
.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
}