J'essaie de charger un contrôleur en fonction d'un stateparam pour le rendre réutilisable
.state("dashboard.item.detail", { url: "/detailId/:detailId/detailName/:detailName", views: { 'main@': { templateUrl: function ($stateParams){ //move this to a util function later var tempName = unescape($stateParams.detailName); tempName = tempName.replace(/\s/g, "-"); return '../partials/slides/' + tempName + '.html'; }, resolve: { DetailData: ['DetailService', function(DetailService){ return DetailService.getDetails(); }] }, controller: function ($stateParams) { console.log( $stateParams.detailName + 'Ctrl'); return $stateParams.detailName + 'Ctrl'; } } } })
Manette
.controller('NemtCtrl', ['$scope', '$rootScope', 'DetailData', function ($scope, $rootScope, detailData) { console.log(detailData); }]);
Le contrôleur fonctionnera si je retire la fonction et que j'utilise simplement (la console enregistrera detailData)
controller: 'NemtCtrl'
Mais ne fonctionnera pas si je le fais:
controller: function ($stateParams) { return 'NemtCtrl'; }
Qu'est-ce que je fais mal ici? Y a-t-il une meilleure manière de faire cela?
Ce qui se passe ici, c'est que lorsque vous écrivez ceci:
controller: 'NemtCtrl'
Vous dites angulaire pour obtenir le contrôleur nommé 'NemtCtrl'. Mais quand, d'un autre côté, écrivez ceci:
controller: function ($stateParams) { return 'NemtCtrl'; }
Vous définissez un contrôleur pour cet état.
Mettre à jour
Selon les ui-router docs, la façon de faire est la suivante:
$stateProvider.state('contacts', { template: ..., controllerProvider: function($stateParams) { var ctrlName = $stateParams.type + "Controller"; return ctrlName; } })
Vous pouvez en savoir plus à ce sujet ici
Mise à jour 2
Pour votre cas, ce serait quelque chose comme:
.state("dashboard.item.detail", { url: "/detailId/:detailId/detailName/:detailName", views: { 'main@': { templateUrl: function ($stateParams){ //move this to a util function later var tempName = unescape($stateParams.detailName); tempName = tempName.replace(/\s/g, "-"); return '../partials/slides/' + tempName + '.html'; }, resolve: { DetailData: ['DetailService', function(DetailService){ return DetailService.getDetails(); }] }, controllerProvider: //Change to controllerProvider instead of controller function ($stateParams) { //console.log( $stateParams.detailName + 'Ctrl'); return $stateParams.detailName + 'Ctrl'; } } } })