【问题标题】:Backbone.js common bootstrap pattern for using routing history api用于使用路由历史 API 的 Backbone.js 通用引导模式
【发布时间】:2013-07-12 15:42:44
【问题描述】:

我有一个单页 Web 应用程序是在backbonejs 上编写的。我使用不同的路线,每条路线对应一个控制器。当我加载我的应用程序根 URL (myapp.com/) 或任何没有参数的非根 URL (myapp.com/somelocation) 时,它可以正常工作。但是,当我尝试使用查询参数(即 myapp.com/somelocation?z=search)将我的应用程序直接加载到任何位置时,我遇到了一些麻烦。应用呈现两次 - 第一次使用对应于 myapp.com/somelocation?z=search 的正确控制器,第二次使用对应于 myapp.com/somelocation 的控制器。

路由表如下所示:

routes: {
        'login': 'login',
        'home': 'home',
        'timeline?*query': 'timelineWithQuery',
        'timeline': 'timeline',
         ...
        '*path': 'defaultRoute'
    }, ...

控制器如下所示:

defaultRoute: function() {
    router.navigate('home', {trigger: true});        
},

login: function(args) {
    var controller = new App.PageController.Mobile.AuthPageController($('body'));
    controller.executeLogin(args);
},

timeline: function(args) {
    var controller = new App.PageController.Mobile.TimelinePageController($('body'));
    controller.executeTimeline(args);
}, ...

Document.ready 脚本如下所示:

// ...
router.navigate(window.location, {trigger: true});
// ...

如果我不调用 router.navigate(window.location, {trigger: true});明确地没有一个控制器呈现我的应用程序起始页。当我调用它时,应用程序正常工作,直到我尝试从 myapp.com/timeline?foo=bar URL 开始。如果我这样做,我的应用程序会呈现两次(无需重新加载页面)。

有什么建议吗?具有丰富路由场景的主干js驱动的单页应用程序的常见 document.ready 引导模式是什么?

【问题讨论】:

    标签: backbone.js single-page-application backbone-routing html5-history


    【解决方案1】:

    导航使用location.pathname(通过pushState)或location.hash,因此location.queryString不是导航过程的一部分。我不确定这一行:'timeline?*query': 'timelineWithQuery', 是如何转换为正则表达式的,顺便说一句,这并不重要,因为您每次都会在 my/path 上运行该正则表达式,而不是在 my/path?queryString 上。

    您必须在Backbone.history.start({pushState: true}) 之前定义每条路线。当您调用它时,它应该运行当前路线,因此您不必在此之后手动调用导航。

    【讨论】:

    • 当然我在调用 router.navigate(window.location, {trigger: true}) 之前使用 Backbone.history.start()。而且我仍然遇到一些带有查询字符串的路由问题。
    • 看起来我应该在文档就绪回调中使用 Backbone.history.start({root: window.location}) 而不是 router.navigate(window.location, {trigger: true}) 。但是现在我在连接 url 部分时遇到了一些麻烦。调用 historty.start 后,我​​的 URL 看起来像 windows.location + windows.location.path。
    • 请阅读更多关于 REST 服务的信息。 url.path 是一个资源标识符,您只能使用它进行导航。找到资源后,您可以使用 url.queryString 过滤或修改输出。您不应该将 url.queryString 注入到导航中,这是一种不好的做法...您可以使用 Backbone 设置和修改 url.path,它会自动完成,因此您不必通过导航使用 window.location .. . 首先你创建你的路由器实例。之后在 domReady 中开始历史记录。之后,历史记录会自动执行其他所有操作。
    • 我有单独的 REST API 和 Web 客户端。如果需要,API 看起来像带有查询字符串过滤的纯资源。Web 客户端有自己的 url。WebApp 从 API 检索数据并呈现页面。页面不直接对应API资源。应用中的URL对应不同的应用屏幕(客户端状态)。重新加载页面必须保存客户端状态(通过路径+查询字符串恢复)。应用程序中的查询字符串可以是位置的一部分,而不仅仅是过滤。 myapp.com/tl 对应于时间轴屏幕,myapp.com/tl?z=bndg5 url 对应于将小部件绑定到时间轴页面上,用于 id 为 5 的项目
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2018-09-13
    • 2021-02-04
    相关资源
    最近更新 更多