以前、私のバックボーンルーターは次のようになりました。
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)
これは問題なく動作します。ただし、ルートを切り替えるたびにコレクションが再フェッチされるため、明らかに待ち時間が少しあります。これはバックボーンの良い習慣ですか?これを行うためのより良い方法があるかどうかはわかりません。