否则对于具有类型参数的状态

时间:2016-05-02 20:54:23

标签: javascript angularjs angular-ui-router url-routing

我开始在路由配置中使用类型化参数(例如{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

1 个答案:

答案 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