【问题标题】:Backbone Router confusion on howto trigger骨干路由器混淆如何触发
【发布时间】:2012-11-19 17:58:04
【问题描述】:

我似乎无法让主干路由器以预期的方式工作。我 i) 实例化我的路由器,然后 ii) 调用 Backbone.history.start( { pushState: true, root: '/' } )。使用下面的代码...

  • 1) 转到“/dashboard”或“/grid”,未调用定义的函数
  • 2) 当我调用 myrouter.navigate("grid") 时,定义的函数没有被调用
  • **) 但是,如果我随后返回或向前浏览历史记录,则会调用定义的函数。
    Router : Backbone.Router.extend

        routes:
          "dashboard":                  "dashboard"
          "grid/:storyid":              "grid"

        dashboard: ->
          console.log("...")

        grid: (storyid) ->
          console.log("...")

我需要做什么才能让案例 1) 和 2) 正常工作?

谢谢

【问题讨论】:

  • 您是否创建了路由器实例并启动了历史跟踪? IE这个位:Backbone.history.start()
  • 是的。 myrouter = new router.Router(),然后是Backbone.history.start( { pushState: true, root: '/' } )
  • 你可以尝试在“dashboard”路由前面加一个/,这样它就会变成:“/dashboard”:“dashboard”
  • 试试myrouter.navigate('grid', {trigger: true})router doc

标签: backbone.js coffeescript


【解决方案1】:

您的路由器工作正常。我认为您对它的工作原理以及原因的期望是错误的。

1) 转到“/dashboard”或“/grid”,不调用定义的函数

当您在浏览器的 URL 栏中键入“/dashboard”或“/grid”时,您的浏览器会向您的服务器发出请求以获取该 URL。这绕过了路由器,因为浏览器正在向服务器发出请求。

在浏览器的 URL 输入中键入 URL 不会从服务器请求新页面的唯一情况是,当您仅修改哈希片段时:“#whatever”。

当我调用 myrouter.navigate("grid") 时,定义的函数不会被调用

router.navigate 的默认行为是使用适当的路由更新 URL,但不是由路由器处理的路由 - 正是您所描述的。

如果要强制浏览器处理路由更改,请将true 作为第二个参数传递:myrouter.navigate("grid", true)

**) 但是,如果我随后返回或向前浏览历史记录,则会调用定义的函数。

这是因为路由器已经使用浏览器历史 API 注册了自己,并且有机会在浏览器返回服务器获取请求的 URL 之前处理由 fwd / back 按钮引起的 URL 更改.

【讨论】:

  • 我最终通过在 myobj 上创建 navi 函数包装器解决了这个问题。该包装器只调用this.navigate("asdf", { trigger: true }),这给了我预期的行为。然而,我仍然觉得这令人沮丧,因为直接调用myobj.navigate("asdf", { trigger: true }) 给我留下了我在此报告的问题。但是您提供的解决方案也有效。我很困惑为什么 A)myobj.navigate("asdf", true) 有效,但 B)myobj.navigate("asdf", { trigger: true }) 无效。以及为什么将呼叫包装在 B) 中,突然使该呼叫起作用。我觉得它很不稳定。
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2013-03-11
相关资源
最近更新 更多