在 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", undefined]。不过,我很好地处理额外的“/”!
这个工作得很好:
"/foo/bar".match("\/foo\/([^\/]+)(?:\/([^\/]+))?")
重要的提示
经过一些测试并找到该模式后,目前看来 AngularJS 1.15 $routeProvider 并不真正支持它?我已经发布了这个,认为通过只为 /foo/:bar/:das 保留一个 routeMapper,其中第三个参数是可选的,可以作为 /foo/:bar 工作,然后在 locationChange() 上使用正则表达式。