Backbone.js路由器路由不区分大小写

时间:2011-10-13 05:41:08

标签: backbone.js

有谁知道如何使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'
    }
});

2 个答案:

答案 0 :(得分:10)

optamd3 Backbone.Router版本的escapeRegExp似乎在namedParam中没有splatParamthisRegExp个常量。此外,完全取代功能更有可能在未来中断。

我通过调用被覆盖的函数并使用其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 namedParamsplatParam正则表达式):

_routeToRegExp : function(route) {
  route = route.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&")
               .replace(/:\w+/g, "([^\/]*)")
               .replace(/\*\w+/g, "(.*?)");
  return new RegExp('^' + route + '$', 'i'); // Just add the 'i'
}

使用routesBackbone.Router.route()对象中的路由添加到路由表中,并使用_routeToRegExp将其转换为正则表达式。

以下是_routeToRegExp方法的演示:http://jsfiddle.net/ambiguous/MDSC5/