我开始在路由配置中使用类型化参数(例如{id:int}
)。如果状态因类型而与不匹配,则otherwise
似乎不会触发。
例如:
$stateProvider
.state('stuff', {
url: '/version/{version:int}/stuff',
templateUrl: // ...,
controller: // ...
})
.state('list', {
url: '/list',
// ...
});
$urlRouterProvider.otherwise('/list');
如果版本是“x”(不是int),我不会被重定向到列表页面。相反,我最终在一个没有错误的空白页面上。
我该如何解决这个问题?
(澄清:我在地址栏中输入了无效的网址来测试,而不是使用ui-sref
。)
更新:我相信我已经找到了导致它的原因(感谢@RadimKöhler取消了一些可能性的例子)。查看我的plunk。
对于与$urlMatcherFactoryProvider.type()
构建的自定义类型不匹配的网址,一切正常除外。我根据this question的答案使用了guid
类型。
我可以通过在URL中使用正则表达式来解决这个问题,但是修复它会很不错。
更多信息:将pattern
添加到自定义Type object似乎可以解决此问题。模式必须省略锚(^$
),所以类似于:
pattern: /[a-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12}/i
答案 0 :(得分:1)
我会说,你想要的概念正在发挥作用。有a working example
此状态def (1:1提问)
$stateProvider
.state('stuff', {
url: '/version/{version:int}/stuff',
templateUrl: 'tpl.html',
controller: 'StuffCtrl',
})
.state('list', {
url: '/list',
templateUrl: 'tpl.html',
controller: 'ListCtrl',
});
$urlRouterProvider.otherwise('/list');
将正确处理这些链接:
// list
<a href="#/list">
// ui-sref
<a ui-sref="stuff({version:1})">
<a ui-sref="stuff({version:2})">
// href
<a href="#/version/12/stuff">
这些将不起作用(如预期的那样) - 所以他们不会创建任何href (这种状态不存在这样的状态)
<a ui-sref="stuff({version:'A'})">
<a ui-sref="stuff({version:'xyz'})">
这些 href
将重定向到
<a href="#/version/x/stuff">
<a href="#/version/AB/stuff">
检查行动here