1

私の見解では、この機能があります。

saveData: function(){
    this.collection.setSelected(this.collection.where({name : this.$('#projects').val()}));
}

そして私のコレクションの対応する関数:

setSelected: function(project){
    this.each(function(model){
        model.set({selected: false});
    });
    project[0].set({selected: true});
}

それで、私の質問は、実際のモデルにアクセスするためにプロジェクト配列の最初の要素にアクセスする必要があるのはなぜですか?私は何か間違ったことをしていますか?

また、コレクション設定のすべてのモデルをfalseにループして、1つをtrueに設定するのは、少しOTTのようですが、これは正しい方法ですか?

4

3 に答える 3

0

これをまっすぐにしましょう、これはあなたが達成しようとしていることです:

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);
    }
});
于 2012-12-04T11:36:54.390 に答える
0

実際のモデルにアクセスするためにプロジェクト配列の最初の要素にアクセスする必要があるのはなぜですか?

答えは、ドキュメントによるとwhere、一致したモデルの配列を返します。したがって、インデックスを使用してアクセスする必要があります。

1つのモデルのみを返す限り、これまでに設定selectedしたアプローチに問題はありません。truewhere

2番目の疑い

selectedasを使用してすべてのモデルを作成し(問題ないと思います)、次のようなメソッドfalseを保持してみませんか?setSelected

setSelected = function(project, value) {

  project[0].set({selected: value});

  // well a better approach would be to define a method in the model saying,
  // select() which sets the attribute, and call it from here with
  // project[0].select(params), but its up to you how you do it.
}

trueまたはfalseselectまたはdeselect任意のモデルで同じメソッドを呼び出すことができます。

于 2012-12-04T15:11:22.563 に答える
0

実際のモデルにアクセスするためにプロジェクト配列の最初の要素にアクセスする必要があるのはなぜですか

where配列を返すを使用しているためです。findこの場合、最初に一致するオブジェクトを返すを使用できます。

this.collection.find(function(x) { return x.get("name") == this.$('#projects').val() });

コレクション内のすべてのモデルをループするのは少しOTTのようです

一度に1つのモデルのみを選択する場合は、選択したモデルを見つけて選択を解除することをお勧めします。何かのようなもの:

this.collection.setSelected(this.$('#projects').val());

と:

setSelected: function(name){
    var selected = this.find( function(x) { return this.get("selected") === true } );
    if (typeof selected != "undefined") selected.set("selected", false);

    var newSelected = this.find( function(x) { return this.get("name") === name });
    if (typeof newSelected != "undefined") newSelected.set("selected", true);
}
于 2012-12-04T21:05:04.733 に答える