2013-09-24 145 views
0

我有一个路由器这样定义:严格的参数匹配

var MyRouter = Backbone.Router.extend({ 
    routes: { 
    // catch-all for undefined routes 
    "*notfound" : "notFound", 
    }, 

    initialize: function(options) { 
    this.route("my_resource/clear_filters", 'clearFilters'); 
    this.route("my_resource/:id", 'show'); 
    }, 

    show: function(id){ 
    console.log('show', id); 
    }, 

    clearFilters: function() { 
    console.log('clearFilters'); 
    }, 

    notFound: function() { 
    console.log('notFound'); 
    }, 
}); 

var app = {}; 
app.MyRouter = new MyRouter(); 
Backbone.history.start({silent: true}); 

因此下面的网址将被映射为:

var opts = {trigger: true}; 
app.MyRouter.navigate('/foo', opts);      // logged -> 'notFound' 
app.MyRouter.navigate('/my_resource/123', opts);   // logged -> 'show', '123' 
app.MyRouter.navigate('/my_resource/clear_filters', opts); // logged -> 'clearFilters' 
app.MyRouter.navigate('/my_resource/some_thing', opts); // logged -> 'show', 'some_thing' 

我怎么能限制my_resource/:id路线仅匹配数字参数,以便app.MyRouter.navigate('/my_resource/some_thing')notFound处理?

回答

2

fine manual

路线router.route(route, name, [callback])

手动创建用于路由器的路由,该route参数可以是一个路由字符串或正则表达式。来自路由或正则表达式的每个匹配捕获都将作为参数传递给回调。

所以你总是可以说这样的话:

this.route(/my_resource\/(\d+)/, 'show') 

路由器的initialize如果你需要在路径更加精确的控制不是骨干网的字符串模式给你。

+0

是的,我知道路由可以使用正则表达式,但据我了解,你可以使用正则表达式或命名参数 - 你不能有一个命名的正则表达式 - 所以没有办法将匹配的正则表达式传递给回调函数。 –

+1

“来自路由或正则表达式的每个匹配捕获都将作为参数传递给回调函数。”在将路由转换为正则表达式时,骨干在内部用正则表达式替换':name'。或者你是否试图发送几个路由模式到同一个路由处理程序,并且你想知道哪个路由在处理程序中被触发? “ –

+0

”当将路由转换为正则表达式时,主干在内部替换:用正则表达式组名称东西“ 明白了!那是失踪的一块。谢谢:) –