【问题标题】:Why is my backbone router redirecting to the app root?为什么我的主干路由器重定向到应用程序根目录?
【发布时间】:2012-09-07 20:00:17
【问题描述】:

我在我的应用中使用以下路由器:

app.Router = Backbone.Router.extend({
    // define the route and function maps for this router
    routes : {
        "" : "showLogin",
        // Sample usage: http://ServerManager/
        "login" : "login",
        // Sample usage: http://ServerManager/#login
        "logout" : "logout",
        // Sample usage: http://ServerManager/#logout
        "folders" : "listFolders",
        // Sample usage: http://ServerManager/#folders
        "folders/:name" : "showFolder",
        // Sample usage: http://ServerManager/#folders/System
        "*other" : "defaultRoute"
        // Sample usage: http://ServerManager/#badHash
    },
    showLogin : function() {
        console.log("Home page loaded. Redirecting to #login page.");
        this.navigate("login", {trigger: true, replace: true});
    },
    login : function() {
        //console.log("login route fired");
        // delete sessionStorage items and load a new loginview
        this.changePage(new app.LoginView()); 
    },
    logout : function() {
        //console.log("logout route fired");
        // Clear the token and other session items from sessionStorage
        sessionStorage.clear();
        this.navigate("login", {trigger: true, replace: true});
    },
    listFolders : function() {
        //console.log("listFolders route fired.")
        if (app.folderView === undefined) {
            console.log("creating new app.folderView");
            app.folderView = new app.FolderView();
        }
        else {
            console.log("using existing app.folderView");
        }
        this.changePage(app.folderView);
    },
    showFolder : function(name) {
        console.log( app.router.routes[Backbone.history.fragment] );
        //console.log("showFolder route fired.")
        this.changePage(new app.ServiceView({folder : name}));
        console.log( app.router.routes[Backbone.history.fragment] );
        //app.router.navigate("folder/" + name, {trigger: false});
    },
    defaultRoute : function() {
        alert("Error. Page doesn\'t exist.");
    },
    changePage : function(page) {
        $(page.el).attr("data-role", "page");
        page.render();
        $("body").append($(page.el));
        var transition = $.mobile.defaultPageTransition;
        $.mobile.changePage($(page.el), {changeHash : true, transition : transition});
    }
});

如果我使用

app.router.navigate("folders", {trigger: true, replace: true});

它成功地将应用程序发送到服务器/#folders,但是当我通过时

app.router.navigate("folders/" + id, {trigger: true, replace: true});

它会触发应用程序的根目录并加载我的登录页面。在重定向发生之前,我可以看到正确的 URL(例如 server/folders/folder1)暂时闪烁。关于这里发生了什么的任何想法?

【问题讨论】:

  • 我不确定问题出在哪里,但我认为 jquery-mobile-router 插件最初是因为 JQM 不能很好地与backbone.js 配合使用而创建的。

标签: jquery-mobile backbone.js backbone-routing


【解决方案1】:

骨干路由器希望最后有更多通用路由。

设置folders/:id 路由,然后设置folders 路由。

更新

其实想想也未必是这样的。你可以发布控制台输出吗?它调用了正确的函数吗?

也许$.mobile ... changeHash: true 有冲突。您可能应该只让其中一个框架为您更改 url 哈希。

【讨论】:

  • 我尝试更改路线的顺序并将 changeHash 设置为 false,但结果相同。它会临时加载页面,然后重定向到应用根目录。
  • 过去在 Backbone 文档中的“更通用的路由最后”的东西是无稽之谈,there is no well defined key order in a JavaScript object。您会注意到,Backbone 路由器文档不再说明 routes 中的事物顺序(至少我再也找不到了)。
  • OTOH,我认为 jQuery Mobile 和 Backbone 互相争斗可能是对的。
  • 我已禁用所有 jqm 路由和导航。如果我在我的路由器 showLogin 函数中注释掉导航行,那么一切正常(除非当我点击应用程序的根目录时它不会显示登录页面)。
  • @muistooshort 消息来源仍然说它遵循“更通用的路线最后”的概念。事实上,只有当我以这种方式将 rails 路由映射到主干时,它才对我有用,即posts/:id AFTER posts/new
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多