Angularjs:如何创建可选的路由映射参数

Angularjs: How to create a optional route map param?

本文关键字:路由 参数 映射 创建 何创建 Angularjs      更新时间:2023-09-26

在AngularJS 1.1.5上,我有两个映射的路由:

 /category/:name/:article 
 
 /category/:name

我只想拥有最新的,并将参数:article路由到操作。此操作实际上是扩展列表中的元素,因此我不需要重新加载控制器等,或者让我们想象在其他情况下可以例如运行动画。例如,假设我有一个幻灯片,我想显示幻灯片编号 5 - 这种事情!无需重新加载所有内容!

路线(我使用的是滑块示例,因为它不那么令人困惑):

.config(function(...))
$routePRovider
.when('/slider/:category', {
    templateUrl: 'slider.html',
    controller: 'sliderCtrl'
})
.when('/slider/:category/:number', {
    templateUrl: 'slider.html',
    controller: 'sliderCtrl'
});

然后在 .run() 或 .controller() 上,

scope.$on("$locationChangeStart", function(event, next, current){
        var path = $location.path();

        if((path.match("'/slider'/(.+)'/(.+)"))){ ... }; /* I'd like the 2 param to be optional, I'm still trying to find the right or correct regex for this atm. I knnow that I'll have to keep just one routemap controller, the one without the :number param */
})

经过一些研究,我找到了一个可能的解决方案:

模式

"/foo/bar/das".match("'/foo'/([^'/]+)('/[^'/]+)?") 
返回

三个参数,如果最后一个省略,则只返回两个,但我得到额外的"/",如 ["foo"、"bar"、"/das"] 和 ["foo"、"bar",未定义]。不过,我不得不处理额外的"/"很好!

这个工作得很好:

"/foo/bar".match("'/foo'/([^'/]+)(?:'/([^'/]+))?")

重要说明

经过一些测试并找到了模式,目前看起来 AngularJS 1.15 $routeProvider并不真正支持它?我已经发布了这个,认为通过只保留一个/foo/:bar/:d as 的 routeMapper,其中第三个参数是可选的,可以作为/foo/:bar 工作,然后在 locationChange() 上使用正则表达式。

要使这两个参数都可选,您可以使用:

var m = path.match(/issue(?:'/([^/]*))?(?:'/([^/]*))?/i);