Ui-router: маршрут без шаблона просмотра
Можно ли настроить маршрут в ui-router
, который имеет только контроллер? Цель состоит в том, что при определенном URL-адресе единственное, что я хотел бы сделать, это действовать программно и не отображать ничего с точки зрения представления. Я прочитал документы, но я не уверен, что они предлагают способ сделать это.
Да, я прочитал: https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-open-a-dialogmodal-at-a-certain-state, но это не совсем то, что я ищу.
Например, допустим, что у меня есть основное тело с представлением:
<body ui-view></body>
И какая-то базовая конфигурация:
// Routes
$stateProvider
.state('myaction', {
url: "/go/myaction",
onEnter: function() {
console.log('doing something');
}
});
При посещении /go/myaction
вид пуст. Можно ли это сделать?
Ответы
Ответ 1
Мне удалось решить эту проблему, перенаправив состояние безголовы, в которое я принимал программные действия, в состояние WITH с представлением в конце состояния без головы:
$stateProvider
.state('myaction', {
url: "/go/myaction",
onEnter: function() {
console.log('doing something');
}
controller: function($state) {
$state.go('home');
}
});
Ответ 2
У вас нет контроллера без вида, но вы можете использовать onEnter
вместо контроллера. Если вы не хотите изменять текущий вид при доступе к этому состоянию, вы можете определить его как дочернее состояние:
$stateProvider
// the parent state with a template
.state('home', {
url: '/home',
templateUrl: '/home.html',
controller: 'HomeCtrl'
})
// child of the 'home' state with no view
.state('home.action', {
url: '/action',
onEnter: function() {
alert('Hi');
},
});
Теперь в home.html
вы можете сделать что-то вроде этого:
<a href ui-sref=".action">Greet me!</a>
Ответ 3
Из документов:
Предупреждение. Контроллер не будет создан, если шаблон не определен.
Почему вы не используете пустую строку в качестве шаблона для преодоления этого?
Ответ 4
Да, вы можете это сделать. Используйте абсолютные имена просмотров, чтобы повторно использовать <ui-view>
другого состояния.
Взгляните на этот пример:
Пользователи идут в мое приложение, но в зависимости от того, что они прошли проверку подлинности или нет, я хочу отправить их на общедоступную или закрытую страницу. Я использую только состояние index
, чтобы проверить, вошли ли они в систему или нет, а затем перенаправить их на index.private
или index.public
.
В дочерних состояниях используется абсолютное имя вида, чтобы использовать элемент <ui-view>
, соответствующий состоянию index
. Таким образом, мне не нужно делать второй вложенный <ui-view>
.
$stateProvider.state('index', {
url: "/",
controller: 'IndexCtrl'
}).state('index.private', {
views: {
"@": {
templateUrl: 'private.html',
controller: 'PrivateCtrl'
}
}
}).state('index.public', {
views: {
"@": {
templateUrl: 'public.html',
controller: 'PublicCtrl'
}
}
});
Небольшое примечание в этом примере: здесь я использую ярлык @
. Обычно вы используете [email protected]
.