我會說,你RowsView
應該跟蹤其組件RowView
s。個人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;
}
然後你只需要一種方法來一個標籤轉換爲指數this.child_views
。
一種方法是使用事件,骨幹觀點都有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
將在this.collection.map
v.on('tab-next', this.edit_next);
,你可以有一個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/
一個變體上這可以將對RowsView
的引用添加到RowView
,然後tab_next
可以直接添加請致電this.parent_view.edit_next()
。
另一種選擇是把處理程序中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/