有谁知道如何使Backbone路由不区分大小写?
即。 http://localhost/Products HTTP://本地主机/产品
都会触发产品路径
routes: {
"products": "products"
},
根据mu太短的答案,这里是完整的路由器。谢谢你的帮助
MainRouter = Backbone.Router.extend({
routes: {
"": "home",
"products": "products"
},
initialize: function () {
Backbone.history.start({ pushState: true });
},
home: function () {
// just show the products!!
this.products();
},
products: function () {
// wire up the view.
var ps = new ProductsView({ el: '#products', collection: myCollection });
ps.render();
// fetch the collection!!
myCollection.fetch();
},
_routeToRegExp: function (route) {
route = route.replace(this.escapeRegExp, "\\$&")
.replace(this.namedParam, "([^\/]*)")
.replace(this.splatParam, "(.*?)");
return new RegExp('^' + route + '$', 'i'); // Just add the 'i'
}
});
答案 0 :(得分:10)
optamd3
Backbone.Router
版本的escapeRegExp
似乎在namedParam
中没有splatParam
,this
和RegExp
个常量。此外,完全取代功能更有可能在未来中断。
我通过调用被覆盖的函数并使用其var Router = Backbone.Router.extend({
_routeToRegExp: function(route) {
route = Backbone.Router.prototype._routeToRegExp.call(this, route);
return new RegExp(route.source, 'i'); // Just add the 'i'
},
...
});
:
{{1}}
答案 1 :(得分:5)
您可以使用Backbone.Router.route()
手动绑定所有路由,它将接受路由作为字符串或RegExp对象:
Backbone.Router.route(/products/i, ...
或者您可以在子类化时通过Backbone.Router
替换此{em>私有方法(通过Backbone.Router.extend()
,谢谢Crescent Fresh):< / p>
_routeToRegExp : function(route) {
route = route.replace(escapeRegExp, "\\$&")
.replace(namedParam, "([^\/]*)")
.replace(splatParam, "(.*?)");
return new RegExp('^' + route + '$');
}
有了这个(你必须复制/扩展escapeRegExp
namedParam
和splatParam
正则表达式):
_routeToRegExp : function(route) {
route = route.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&")
.replace(/:\w+/g, "([^\/]*)")
.replace(/\*\w+/g, "(.*?)");
return new RegExp('^' + route + '$', 'i'); // Just add the 'i'
}
使用routes
将Backbone.Router.route()
对象中的路由添加到路由表中,并使用_routeToRegExp
将其转换为正则表达式。
以下是_routeToRegExp
方法的演示:http://jsfiddle.net/ambiguous/MDSC5/