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.mapedit_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/