以前,我的 Backbone 路由器是这样的:
class App.Routers.ThingsRouter extends Backbone.Router
routes: '': 'index'
routes: 'previews/:id': 'show'
initialize: ->
@collection = new App.Collections.ThingsCollection
@collection.fetch
index: ->
view = new App.Views.ThingsIndex(collection: @collection)
$('#app-container').html(view.render().el)
show: (id) ->
@model = @collection.get(id)
view = new App.Views.ThingsShow(model: @model)
$('#app-container').html(view.render().el)
当导航到 时http://localhost
,我会index
渲染视图,当单击单个元素时,我会show
渲染视图。但是,如果我http://localhost/things/1
直接访问(即通过输入 URL),则show
不会呈现视图。我意识到这是因为视图是在@collection.fetch
完成之前渲染的。我将路由器更改为以下内容:
class App.Routers.ThingsRouter extends Backbone.Router
routes: '': 'index'
routes: 'previews/:id': 'show'
initialize: ->
@collection = new App.Collections.ThingsCollection
index: ->
@collection.fetch success: =>
view = new App.Views.ThingsIndex(collection: @collection)
$('#app-container').html(view.render().el)
show: (id) ->
@collection.fetch success: =>
that.model = that.collection.get(id)
view = new App.Views.ThingsShow(model: @model)
$('#app-container').html(view.render().el)
哪个工作正常。但是,由于每次切换路由时都会重新获取集合,因此显然会有一点延迟。这是很好的 Backbone 做法吗?不确定是否有更好的方法来做到这一点。