Backbone.js 主干路由器关于如何触发的困惑

Backbone.js 主干路由器关于如何触发的困惑,backbone.js,coffeescript,Backbone.js,Coffeescript,我似乎无法让主干路由器以预期的方式工作。I)实例化我的路由器,然后ii)调用Backbone.history.start({pushState:true,root:'/'})。使用下面的代码 1) 转到“/dashboard”或“/grid”,不调用已定义的函数 2) 当我调用myrouter.navigate(“网格”)时,不调用已定义的函数 **)然而,如果我随后回顾或向前浏览历史,那么将调用已定义的函数 我需要做什么才能让案例1)和案例2)起作用 谢谢您的路由器工作正常。我认为你对它的

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

  • 1) 转到“/dashboard”或“/grid”,不调用已定义的函数
  • 2) 当我调用myrouter.navigate(“网格”)时,不调用已定义的函数
  • **)然而,如果我随后回顾或向前浏览历史,那么将调用已定义的函数
我需要做什么才能让案例1)和案例2)起作用


谢谢

您的路由器工作正常。我认为你对它的工作原理和原因的期望值都不高

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

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

唯一一次在浏览器的URL输入中键入URL不会向服务器请求新页面的情况是,您只修改哈希片段:“随便什么”

当我调用myrouter.navigate(“网格”)时,不调用已定义的函数

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

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

**)然而,如果我随后回顾或向前浏览历史,那么将调用已定义的函数


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

您是否创建了路由器实例并启动了历史跟踪?IE此位:
Backbone.history.start()
Yes
myrouter=new router.router()
,然后
Backbone.history.start({pushState:true,root:'/'})
。你能试着把一个/放在“dashboard”路由前面,这样它就会读到:“/dashboard”:“dashboard”try
myrouter.navigate({grid',{trigger:true})
。我最终通过在myobj上创建
navi
函数包装器解决了这个问题。该包装器只调用
this.navigate(“asdf”,{trigger:true})
,这提供了预期的行为。然而,我仍然觉得这很令人沮丧,因为直接调用
myobj.navigate(“asdf”,{trigger:true})
给我留下了我在这里报告的这个问题。但你给出的解决方案也能起作用。我不明白为什么A)
myobj.navigate(“asdf”,true)
起作用,但是B)
myobj.navigate(“asdf”,{trigger:true})
不起作用。为什么用B)来包装电话会突然让电话起作用呢。我觉得它很不可靠。
    Router : Backbone.Router.extend

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

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

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