Я должен сделать два типа url: /:culture
и /:author
, где оба имеют параметры url первого уровня. В то время как в культуре заданы предопределенные параметры, такие как en
, es
, en-us
, br
, fr
, it
и т.д., Автором может быть любое имя пользователя из db (кроме названий культур). Поэтому я хочу сделать маршрутизацию, которая могла бы отправить пользователя в HomeCtrl
когда параметр находится в наборе культур, и если бы он не отправил его в AuthorCtrl
. Что я мог сделать?
.when('/:culture/', {
templateUrl:'partials/home/home',
controller:'vvHomeCtrl'
});
Вы можете определить templateUrl и контроллер как функции и сделать этот маршрут следующим образом:
.when('/:cultureOrAuthor/', {
templateUrl: function(params) {
// AVAILABLE_CULTURES is your predefined array
if(AVAILABLE_CULTURES.indexOf(params['cultureOrAuthor'])!==-1) {
return 'urlForCultures';
} else {
return 'urlForAuthors';
}
},
controller: function($scope, $routeParams) {
if(AVAILABLE_CULTURES.indexOf($routeParams['cultureOrAuthor'])!==-1) {
// first logic
} else {
// second logic
}
}
});
Это хорошее решение для простых контроллеров. В противном случае подумайте об использовании разрешения от маршрутизатора (docs).
Я согласен с решением @Mates, проверяя, действителен ли параметр культуры. Тем не менее, я бы, вероятно, попытался использовать свойство redirectTo
для разделения двух маршрутов.
.when('/:culture/', {
templateUrl:'partials/home/home',
controller:'vvHomeCtrl',
redirectTo:function(routeParams, path, search) {
if(cultures.indexOf(routeParams.culture)!==-1) {
//return path(string) to author route
}
return path;
}
})
.when(/* Author route definition */);