2013-08-08 10 views
9

Ho un percorso simile che dovrebbe caricare una vista e un controller diversi in base al fatto che il parametro sia o meno un numero. Esempio:AngularJS regex route per URL simili per caricare controller diversi e visualizzare

  • /artists/2 dovrebbe ArtistsIndexController con vista /www/artists/index.html
  • /artists/name dovrebbe ArtistsProfileController con vista /www/artists/profile.html

Idealmente vorrei usare qualcosa come:

$routeProvider.when("/artists/:page", { 
    templateUrl: "/www/artists/index.html", 
    controller: "ArtistsIndexController" 
}); 

$routeProvider.when("/artists/:name", { 
    templateUrl: "/www/artists/profile.html", 
    controller: "ArtistsProfileController" 
}); 

Dove :page è un numero e :name no.

Nota Vedo un relativo github issue (trovato da this question) ma mi chiedo se è disponibile una risoluzione o una soluzione preferita.

risposta

1

Per ora sto usando questa soluzione e sarei interessato alle alternative!

1) Creare un modello generico che verrà caricato in un controllore e visualizzare in modo dinamico:

<div ng-controller="controller" ng-include src="templateUrl"></div> 

In questo esempio ho messo questo punto di vista in /www/shared/dynamic-controller.html

2) Creazione di un controllore che controlla i params percorso per determinare quale controller e visualizzare a carico:

angular.module('appName'). 
    controller('ArtistsDynamicRouteController', ['$scope', '$controller', '$routeParams', function($scope, $controller, $routeParams) { 
    if(/^\d+$/.test($routeParams.pageOrId)) { 
     // when pageOrId is a page (number) we want to load the ArtistsIndexController 
     $scope.controller = $controller('ArtistsIndexController', { $scope: $scope }).constructor; 
     $scope.templateUrl = '/www/artists/index.html'; 
    } else { 
     // when pageOrId is an id (non-number) we want to load the ArtistsProfileController 
     $scope.controller = $controller('ArtistsProfileController', { $scope: $scope }).constructor; 
     $scope.templateUrl = '/www/artists/profile.html'; 
    } 
    }]); 

3) usare una via indipendentemente dal tipo di parametro:

// handles both /artists/2 and /artists/username 
$routeProvider.when("/artists/:pageOrName", { 
    templateUrl: "/www/shared/dynamic-controller.html", 
    controller: "ArtistsDynamicRouteController" 
}); 
+1

Vedere [questa domanda] (http://stackoverflow.com/questions/18137810/how-to-eliminate-minification-errors-when-using-controller-in-angularjs) per problemi di minimizzazione quando si esegue questa operazione. – Gloopy

4

Un altro modo è quello di utilizzare il ui-router che supporta le espressioni regolari per le tratte (tra una sfilza di altre cose) che consentirebbe:

$stateProvider.state("artists-index", { 
    url: "/artists/{page:[0-9]*}", 
    templateUrl: "/www/artists/index.html", 
    controller: "ArtistsIndexController" 
}); 

$stateProvider.state("artists-profile", { 
    url: "/artists/{name}", 
    templateUrl: "/www/artists/profile.html", 
    controller: "ArtistsProfileController" 
}); 
+0

qual è la differenza tra percorso e stato? –

+0

@Apul quando ho usato ui-router ho sempre avuto un percorso per ogni stato quindi ho solo pensato agli stati come a un percorso. I [documenti] (https://github.com/angular-ui/ui-router) menzionano che non tutti gli stati hanno bisogno di un percorso, ma all'inizio non mi preoccuperei di questo. Puoi guardare [questo] (https://en.wikipedia.org/wiki/Finite-state_machine) per ulteriori dettagli sul concetto di una macchina a stati generici. – Gloopy

3

Io uso un brutto hack, che consistono in materia di cambiamento della regexp

var $route = $routeProvider.$get[$routeProvider.$get.length-1]({$on:function(){}}); 


$routeProvider.when("/artists/:page", { 
    templateUrl: "/www/artists/index.html", 
    controller: "ArtistsIndexController" 
}); 

$routeProvider.when("/artists/:name", { 
    templateUrl: "/www/artists/profile.html", 
    controller: "ArtistsProfileController" 
}); 

$route.routes['/artist/:page'].regexp = /^\/(?:artist\/(\d+))$/ 
$route.routes['/artist/:page/'].regexp = /^\/(?:artist\/(\d+))\/$/ 

È brutto ma funziona correttamente. Puoi modificare le espressioni regolari delle tue rotte per farle corrispondere a quelle che vuoi.

+0

Grazie mille, è molto utile per me :) – imbolc

Problemi correlati