これをまっすぐにしましょう、これはあなたが達成しようとしていることです:
USER SELECTS VIEW ELEMENT
GET NAME FROM ELEMENT
VIEW SETS ALL MODELS SELECTED = FALSE
VIEW SETS MODEL MATCHING NAME SELECTED = TRUE
まず第一に、すべてのモデルをループする必要はないということです。これは、が付いたモデルが1つしかないように見えるからselected=true
です。その場合は、利用可能な他のアンダースコア収集メソッドsetSelected
を使用するだけで済みます。また、ビューで物事を単純に保つために、名前の値のみを渡します。
saveData: function(){
this.collection.setSelected(this.$('#projects').val());
}
setSelected: function(name) {
this.findfindfunction(model) {
return model.get('selected');
}).set('selected', false);
this.find(function(model) {
return model.get('name') == name;
}).set('selected', true);
}
明らかに、このfind
メソッドを使用するには、条件に一致するモデルを見つけるために内部でループする必要がありますが、条件に合格した最初のモデルのみを検索するため、where
モデルに関係なくループするモデルを実行するよりも優れています。
明らかに、複数のモデルが選択されている可能性がある場合、これはすべて崩壊します:D
アップデート
あなたの問題についてもう少し考えてみると、別のビューアーキテクチャを使用したほうがよいと思います。あなたが説明する状況では、私は通常、マイクロビューを使用します。つまり、モデルごとの小さなビュー。ビューのマークアップは、チェックボックスだけで構成されている場合があります。
つまり、メインビューでコレクションをループし、モデルごとにビューを作成し、モデルをビューに渡してレンダリングし、マークアップをメインビューに追加できます。
このようにして、特に個々のモデルに関連するイベントをより細かく制御でき、モデル固有の値をビューに簡単にレンダリングできます。以下のこの単純なビューは、テンプレートがチェックボックスとラベル、または類似したものだけで構成されるマイクロビューの単純な例です。
var CheckboxView = Backbone.View.extend({
events: {
'input[type=checkbox]': 'select'
},
render: function () {
var html = _.template($('#myTemplate'), this.model.toJSON());
this.$el.html(html);
return this;
},
select: function () {
this.model.set('selected', true);
}
});