用于仅具有特定值的路由的ui-router

时间:2015-05-27 21:39:31

标签: angularjs angular-ui-router

我正在尝试为具有以下结构的多个唯一着陆页构建路线

domain.com/:state/:city/:category

如何定义路线,以便状态,城市和类别只能是预定义值之一,即:

state = /ca|ma|ak|az|ar .../i city = /los-angeles|san-francisco|.../i category = /painting|plumbing|.../i

这些列表很长,所以拥有一个巨大的正则表达式没有多大意义(或者是吗?)

我会使用规则()吗? $ urlMatcherFactory ?我该如何使用函数?

任何帮助表示赞赏。提前致谢

1 个答案:

答案 0 :(得分:3)

这里的方法是使用自定义类型

如此Q & A所示,如果我们要创建一些准备处理值的类型 true false 1 < / strong>, 0 作为boolean,我们可以像这样定义它(有also working plunker):

app.config(['$urlMatcherFactoryProvider', function($urlMatcherFactoryProvider) {

  $urlMatcherFactoryProvider.type('boolean',
    // our type custom type
    {
     name : 'boolean',
     decode: function(val) { return val == true ? true : val == "true" ? true : false },
     encode: function(val) { return val ? 1 : 0; },
     equals: function(a, b) { return this.is(a) && a === b; },
     is: function(val) { return [true,false,0,1].indexOf(val) >= 0 },
     pattern: /bool|true|0|1/
    })

}]);

我们可以用同样的方式定义我们的类型

$urlMatcherFactoryProvider.type('state'   , ...
$urlMatcherFactoryProvider.type('city'    , ...
$urlMatcherFactoryProvider.type('category', ...

之后我们可以将它们用于任何数量的州定义:

...
.state('mystate', {
    url: 'xxx/{state:state}/{city:city/{category:category}
    ...

这一切都可行,因为我们可以像这样定义UrlMatcher的网址

  

'{' name ':' regexp|type '}' - 带有正则表达式或类型名称的大写占位符。如果正则表达式本身包含花括号,它们必须是匹配对或用反斜杠转义。

所以,不仅是正则表达式 - 还有 type - 包括我们的自定义