RowsView
そのコンポーネントを追跡する必要があると思いますRowView
。個々RowView
のは実際にはの一部でありRowsView
、ビューがその部分を追跡する必要があることは理にかなっています。
したがって、次のようなメソッドRowsView
があります。render
render: function() {
this.child_views = this.collection.map(function(m) {
var v = new RowView({ model: m });
this.$el.append(v.render().el);
return v;
}, this);
return this;
}
Tab次に、をのインデックスに変換する方法が必要ですthis.child_views
。
1つの方法は、イベントを使用することです。バックボーンビューがBackbone.Events
混在しているため、ビューはそれ自体でイベントをトリガーでき、他のものはそれらのイベントをリッスンできます。あなたの中RowView
にこれを持っている可能性があります:
events: {
'keydown input': 'tab_next'
},
tab_next: function(e) {
if(e.keyCode != 9)
return true;
this.trigger('tab-next', this);
return false;
}
そして、あなたの意志とあなたはRowsView
このような種類を持つことができます:v.on('tab-next', this.edit_next);
this.collection.map
edit_next
edit_next: function(v) {
var i = this.collection.indexOf(v.model) + 1;
if(i >= this.collection.length)
i = 0;
this.child_views[i].enter_edit_mode(); // This method enables the <input>
}
デモ: http: //jsfiddle.net/ambiguous/WeCRW/
これの変形は、への参照をsに追加してから、RowsView
をRowView
直接tab_next
呼び出すことthis.parent_view.edit_next()
です。
もう1つのオプションは、keydown
ハンドラーを内に配置することRowsView
です。RowView
これにより、との間に少しの結合が追加されますがRowsView
、この場合はおそらく大きな問題ではありませんが、イベントソリューションよりも少し醜いです。
var RowsView = Backbone.View.extend({
//...
events: {
'keydown input': 'tab_next'
},
render: function() {
this.child_views = this.collection.map(function(m, i) {
var v = new RowView({ model: m });
this.$el.append(v.render().el);
v.$el.data('model-index', i); // You could look at the siblings instead...
return v;
}, this);
return this;
},
tab_next: function(e) {
if(e.keyCode != 9)
return true;
var i = $(e.target).closest('li').data('model-index') + 1;
if(i >= this.collection.length)
i = 0;
this.child_views[i].enter_edit_mode();
return false;
}
});
デモ: http: //jsfiddle.net/ambiguous/ZnxZv/