不久前我遇到了类似的问题。这可能比您想要的要多,但这是我发现的作品。
直接导航
对于直接导航,通常的流程是这样的:
初始化应用程序:大多数backbone.js 项目都会有一些初始化应用程序的代码(App.init)。虽然很多示例在实际 HTML 中插入集合(待办事项等)的 JSON,但我个人喜欢使用此代码作为在页面加载后获取集合的机会,如下所示(coffeescript):
window.App =
...
init: ->
@todos = new App.Todos()
@todos.deferred = @todos.fetch()
@threads.deferred.done ->
App.appRouter = new App.AppRouter(collection: self.todos)
...
(使用 jQuery 的 deferred 是为了确保在实际渲染页面之前获取集合。)
初始化路由器:在这里您有机会为路由器分配一个元素并将集合分配给路由器(我正在使用 thinkbot 的骨干支持中的“SwappingRouter”,我强烈建议您检查一下):
App.Router = Support.SwappingRouter.extend
...
initialize: (options) ->
@el = $('.content')
@collection = options.collection
执行路由处理程序:这是最后一步,此时集合已经初始化并且路由器有一个指向它的指针,所以我们只需要创建视图并渲染它:
show: (id) ->
view = new App.TodosView(model: @collection.get(id))
@swap(view)
(Swap 渲染视图并做一些其他的事情来清理。)
浏览器后退按钮
在这种情况下,既不会调用 App.init 也不会调用 AppRouter.initialize,因此默认情况下不会重新加载集合。Backbone 将自动调用上一条路由的导航,因此根据您的路由处理程序中的内容,视图可能会重新呈现。在上面的示例中,它将是(交换调用渲染),但您可以解决此问题。
这里和主干始终存在的关键问题是,您同时使用无状态 (HTTP) 协议和有状态(富客户端应用程序)环境。将两者对齐以使它们很好地协同工作可能非常棘手。