Пользовательский интерфейс AngularJs - одно состояние с несколькими URL
У меня есть запрос на добавление другого параметра URL, который указывает на состояние, которое я уже настроил. В целях эффективности я пытаюсь выяснить, могу ли я добавить несколько URL-адресов, чтобы указывать на одно и то же состояние, или мне просто нужно использовать метод $UrlRouterProvider.when() для перенаправления в это состояние в этом новом случае.
Ex. это то, что уже существует
.state('site.link1',
{
url: '/link1',
templateUrl: '/views/link1.html',
controller: 'link1Ctrl'
})
и просьба добавить www.site.com/newlink, который указывает на страницу link1. Есть ли что-то подобное;
.state('site.link1',
{
url: '/link1, /newlink',
...
5 ответов
Попробуйте использовать Regex и параметр в URL. Это не оптимально, но работает.
.state('site.link1',
{
url: '/{path:link1|newlink}',
templateUrl: '/views/link1.html',
controller: 'link1Ctrl'
})
Больше информации о регулярных выражениях в URL.
Для создания ссылок с ui-sref
передать тот же параметр с именем состояния в качестве функции
<a ui-sref="site.link1({path:'link1'})" >site link 1</a>
<a ui-sref="site.link1({path:'newlink'})">site new link</a>
Вы используете параметры:
https://github.com/angular-ui/ui-router/wiki/URL-Routing
.state('site.link',
{
url: '/{link}'
..
}
поэтому, когда вы используете то же состояние, как это
$state.go('site.link', {link: 'link1'})
$state.go('site.link', {link: 'link2'})
Вы можете использовать when()
функция
.state('site.link1',
{
url: '/link1',
templateUrl: '/views/link1.html',
controller: 'link1Ctrl'
})
тогда на root config
angular.module('myApp', [...])
.config(function ($urlRouterProvider) {
$urlRouterProvider.when(/newlink/, ['$state','$match', function ($state, $match) {
$state.go('site.link1');
}]);
});
Я нашел этот подход довольно простым и понятным: создать два равных состояния, просто изменив url
имущество
//Both root and login are the same, but with different url's.
var rootConfig = {
url: '/',
templateUrl:'html/authentication/login.html',
controller: 'authCtrl',
data: {
requireLogin: false
}
}
var loginConfig = Object.create(rootConfig)
loginConfig.url = '/login'
$stateProvider
.state('root', rootConfig)
.state('login', loginConfig)
У меня была почти такая же проблема, только с другим ограничением - я не хотел использовать перенаправление, так как я хотел, чтобы URL-адрес в браузере оставался таким же, но отображал то же состояние.
Это потому, что я хотел, чтобы сохраненные пароли Chrome работали для пользователей, которые уже сохранили предыдущий URL.
В моем случае я хотел эти два URL:/gilly
а также/new/gilly
оба указывают на одно и то же состояние.
Я решил это, определив одно состояние для /gilly
и для второго URL я определил абстрактное состояние под названием /new
,
Это должно быть настроено так:
$stateProvider.state('new', {
abstract: true,
url: '/new'
template: '',
controller: function() { }
}).state('gilly', {
url: '/gilly',
template: 'gilly.html',
controller: 'GillyController'
}).state('new.gilly', {
url: '/gilly', // don't add the '/new' prefix here!
template: 'gilly.html',
controller: 'GillyController'
});