私は Backbone (および Marionette) を初めて使用し、両方を使用して非常に単純なアプリを作成しようとしています。アプリには、左側のナビゲーションに「グループ」のメニューがあり、メインの右側の div に「エントリ」のリストがあります。グループ メニュー項目がクリックされるたびに、グループ ID でエントリをフィルタリングして表示し、他のすべてを非表示にします。
これが Entry Item ビューです (すべてのスクリプトは CoffeeScript にあります):
class EntryItemView extends Backbone.Marionette.ItemView
tagName: 'tr'
template: _.template $('#entryItemTemplate').html()
render: ->
@$el.html @template(@model.toJSON())
show: ->
@$el.show()
hide: ->
@$el.hide()
以下は、Marionette の CollectionView を拡張した Entry List ビューです。
class EntryListView extends Backbone.Marionette.CollectionView
itemView: EntryItemView
el: '#main tbody'
これは AppRouter で、かなり単純です。
class AppRouter extends Backbone.Router
routes:
'group/:id' : 'showGroup'
router = new AppRouter()
router.on 'route:showGroup', (id) ->
_.each entryViews, (view) ->
if view.model.get('group_id') is parseInt(id)
view.show()
else
view.hide()
(entryViews
変数は、すべての EntryItemView インスタンスを格納する単純なグローバル配列です)。
このアプローチでは、アプリを /group/:id に移動すると、実際に各 EntryItemView オブジェクトの show() および hide() メソッドが呼び出されます。問題は、このオブジェクトと実際の HTML の間の参照が存在しないように見えるため、実際の要素<tr>
が表示または非表示にならないことです。
ここで私が間違っていることを指摘できますか?前もって感謝します。