0

我似乎无法让主干路由器以预期的方式工作。我 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) 正常工作?

谢谢

4

1 回答 1

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 更改。

于 2012-11-19T20:19:53.973 回答