骨干路由器

时间:2014-08-07 08:50:11

标签: javascript backbone.js backbone-routing

我正在尝试更新网址但在主干中使用标签时不会导航页面,因此可以将标签添加为书签,当我从我的代码库运行它时它什么都不做,

app.Router.navigate('groups/teams', { trigger:false });

但是,如果我在我的控制台中运行它,它会更改来自' http://app.local/groups'的网址。到' http://app.local/groups#groups/teams'为什么要添加#?我想将网址更新为' http://app.local/groups/teams'。

我是否错误地使用了路由器?我的路由器很简单,

        var app = app || {};

        var Router = Backbone.Router.extend({

        routes: {

            'groups' : 'groups'

        },

        groups: function() {
             alert("Groups");
        }

    });

    app.Router = new Router();

3 个答案:

答案 0 :(得分:0)

通常,如果您有以下网址:

www.example.com/foo

foo部分被认为是在example.com服务器上指示名为“foo”的资源。因此,如果客户端(即Javascript代码)将用户重定向到“www.example.com/bar”,则之后将无法执行任何操作,因为浏览器会将用户带到新页面完全(使用全新的Javascript代码)。

大多数(但不是全部)现代浏览器都实现了一个名为pushstate的功能,它可以解决这个问题并允许客户端将URL设置为“www.example.com/bar”,而不会让浏览器返回服务器并且请求该页面。但是,由于并非所有浏览器都支持pushstate,因此Backbone默认不使用它。

相反,Backbone利用了旧的网络技术:锚点/哈希(即www.example.com/#foo)。如果您不希望它这样做,则必须在启动路由器时传递pushState: true, hashChange: false选项。但是,即使你这样做,如果浏览器不支持pushstate,Backbone仍然会回退到基于哈希的导航,所以不能保证它不会仍然执行“#bar”的事情。

我的建议是调整为让所有客户端路由都基于哈希,但如果您确定所有用户都将使用支持推送状态的浏览器,则可以使用该方法。支持推送状态的浏览器可以在这里找到:

http://caniuse.com/#search=pushstate

希望有所帮助。

答案 1 :(得分:0)

散列片段(#page)用于提供这些永久链接,但随着History API的到来,

设置pushState ture:

Backbone.history.start({pushState: true, root: "/public/search/"})

答案 2 :(得分:0)

将此代码添加到路由器初始化:功能

 $('body').delegate('a[href]:not([href^=\#])', 'click', function (e) {
       e.preventDefault();
   Backbone.history.navigate($(this).attr('href'), {trigger: true});

});

它适用于我的情况