Backbone路由器无法与pushState一起工作

10
我想要每个页面请求重定向到我的index.html,并且在我的应用程序中点击任何链接(不是#urls - /real/urls)都会通过router.js运行,以便基本上没有页面刷新 - 纯粹的ajax。有没有一种使用Backbone路由和htaccess轻松实现此目的的方法?
如果我去掉{pushState: true}并像#login一样格式化我的链接,它目前可以正常工作。但是,当我启用pushState并单击#login时,什么也不会发生。相反,只有当我刷新页面时,Backbone才会解释#login并遵循路线以呈现loginView
这是我的路由器:
// Filename: router.js
define( [ 'views/beta/requestInvite', 'views/beta/login' ],
function(requestInviteView, loginView) {
    var AppRouter = Backbone.Router.extend( {
        routes : {
            // Pages
            'login' : 'login',

            // Default
            '*actions' : 'defaultAction'
        },

        // Pages
        login : function() {
            loginView.render();
        },

        defaultAction : function(actions) {
            requestInviteView.render();
        }
    });

    var initialize = function() {
        var app_router = new AppRouter;
        Backbone.history.start({pushState: true});
    };
    return {
        initialize : initialize
    };
});
我希望的是,在requestInviteView中,当点击指向/login的链接时,URL会更改为/login,并且会渲染loginView
谢谢任何帮助!
2个回答

10

从哈希到pushstate的转变并不像改变单个参数那么简单,因为人们可能被误导。我的做法是在视图中捕获点击事件,并调用app.navigate来触发路由。

app.navigate("/login", {trigger: true});

http://backbonejs.org/#Router-navigate


你可以使用类似于这个代码片段的方法来自动完成这个任务。 - colllin

5
尽管Anthony的答案可行,但通常不推荐使用trigger:true。相反,您的应用程序应该被构造成可以使用默认的trigger值调用navigate,将其保留为false
Derick Bailey在他的博客中讨论了这个问题http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/(第二段,“关于Router.Navigate的第二个参数的“AHA!”时刻”)。
此外,整个章节介绍了更详细的路由信息(包括为什么应该将trigger保留为false),可以在此pdf书籍示例中免费下载:http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf(完全披露:我是该书作者)。

1
有趣的是,为了避免第二个参数,为每个控制器复制逻辑似乎有些冗余。我很少使用这种情况(例如,当请求的路由顺序不正确时,我会即时更改它并呈现正确的视图)。这个问题的背景是在链接被点击后触发一个动作,我认为触发它是最好的方法。 - Garrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接