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

时间:2013-10-30 11:10:08

标签: javascript regex angularjs angularjs-routing

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

 /category/:name/:article 

 /category/:name

我想只有最新的,并将param: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 /:das保留一个routeMapper,其中第三个param是可选的可以作为/ foo /:bar,然后在locationChange()上使用正则表达式。我已经在这里以明确的方式发布了我的问题,我已经有了-1但是老实说不明白为什么,我认为知道如何以AngularJs的方式做这件事是有用的。

感谢任何帮助!

感谢您寻找:)

1 个答案:

答案 0 :(得分:0)

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

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