我对ui-router
感到愤怒。一切都按我的意思运行,所有错误的URL都发送到404
状态。但是,即使我的默认状态在网址为/#/
时正确呈现,/
的网址也会重定向到/404/
。如何将default
状态同时提供给/
和/#/
?
app.js
MyApp.config( function ($stateProvider, $urlRouterProvider) {
// For any unmatched url, send to 404
$urlRouterProvider.otherwise("/404/");
$stateProvider
// Home (default)
.state('default', {
url: '/',
resolve: {
...
},
}
});
答案 0 :(得分:11)
我认为这将满足您的需求 -
MyApp.config(function($stateProvider, $urlRouterProvider) {
// the known route
$urlRouterProvider.when('', '/');
// For any unmatched url, send to 404
$urlRouterProvider.otherwise('/404');
$stateProvider
// Home (default)
.state('default', {
url: '/',
resolve: {
// ...
}
// ....
});
});
我指的是this post。您可能需要使用正则表达式来处理包含数据的路由。
您可以使用查询字符串代替网址中的#
,并在状态中通过$stateParams
抓取它。
以下是如何做到这一点 -
// ....
$stateProvider
.state('default', {
url: '/?data',
templateUrl: 'templates/index.html',
controller: 'defaultCtrl'
})
然后您可以使用以下内容与数据一起回家 -
var toStateData = {
key1: 'value1',
key2: 'value2'
}
$state.go('default', {data: JSON.stringify(toStateData)});
您不必在$stateParams
中对数据进行字符串化,但这将允许使用一个参数的更多选项。在defaultCtrl
控制器中,您可以像这样获得传递的查询字符串 -
var stateData = JSON.parse($stateParams.data);
var key1 = stateData.key1;
// ....
答案 1 :(得分:2)
我想只对状态执行此操作,因此不涉及网址提供商。我发现以下解决方案我觉得很好:
(对不起它的coffeescript)
$stateProvider.
state('base.public.notFound',
url: '^*path'
templateUrl: 'views/layouts/404.html'
)
把它作为最后一个状态,你就完成了!