Backbone.js 主干路由器关于如何触发的困惑
我似乎无法让主干路由器以预期的方式工作。I)实例化我的路由器,然后ii)调用Backbone.history.start({pushState:true,root:'/'})。使用下面的代码Backbone.js 主干路由器关于如何触发的困惑,backbone.js,coffeescript,Backbone.js,Coffeescript,我似乎无法让主干路由器以预期的方式工作。I)实例化我的路由器,然后ii)调用Backbone.history.start({pushState:true,root:'/'})。使用下面的代码 1) 转到“/dashboard”或“/grid”,不调用已定义的函数 2) 当我调用myrouter.navigate(“网格”)时,不调用已定义的函数 **)然而,如果我随后回顾或向前浏览历史,那么将调用已定义的函数 我需要做什么才能让案例1)和案例2)起作用 谢谢您的路由器工作正常。我认为你对它的
- 1) 转到“/dashboard”或“/grid”,不调用已定义的函数
- 2) 当我调用myrouter.navigate(“网格”)时,不调用已定义的函数
- **)然而,如果我随后回顾或向前浏览历史,那么将调用已定义的函数
谢谢您的路由器工作正常。我认为你对它的工作原理和原因的期望值都不高 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()
Yesmyrouter=new router.router()
,然后Backbone.history.start({pushState:true,root:'/'})
。你能试着把一个/放在“dashboard”路由前面,这样它就会读到:“/dashboard”:“dashboard”trymyrouter.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("...")