web-dev-qa-db-ja.com

コレクションの属性の設定-バックボーンjs

バックボーンjsのコレクションではset属性を使用できませんが、コレクションに関するメタ情報を保存する必要があることがよくあります。その情報を設定するのに最適な場所はどこですか?

56
idbentley

ただ .extend メタデータ保存機能を備えたコレクション。

var MyCollection = Backbone.Collection.extend({
    initialize: function() {
        ...

        this._meta = {};
    },
    model: ...
    meta: function(prop, value) {
        if (value === undefined) {
            return this._meta[prop]
        } else {
            this._meta[prop] = value;
        }
    },
});

var collection = new MyCollection();
collection.add(someModels);
collection.meta("someProperty", value);

...

var value = collection.meta("someProperty");

specificメタデータを保存するためのより良い場所があるかもしれませんが、これはメタデータが何であるかに完全に依存します。

コレクションコンストラクターを拡張する汎用メタデータを格納するために、それを処理するメソッドが機能するはずです。

このメタデータを保存してサーバーからロードする必要がある場合、より大きなタスクが手元にあることに注意してください。

44
Raynos

イベントのトリガーに関するRaynosのアプローチをアップグレードしたため、コレクションの属性の更新にバインドできます。

cls.groups = Backbone.Collection.extend({

    // ...

    // Reference to this collection's model.
    model: cls.group,

    initialize: function() {
        this._attributes = {}
    },

    // Extend collection with ability to store attributes and trigger events on attributes changing
    attr: function(prop, value) {
        if (value === undefined) {
            return this._attributes[prop]
        } else {
            this._attributes[prop] = value;
            this.trigger('change:' + prop, value);
        }
    },

    // ...

});


cls.group = Backbone.View.extend({

    // ...

    initialize: function() {

        // Catching attribute update
        app.groups.on('change:selected', function(value) {
            // ...
        }, this);
    },

    // ...

    events: {
        'click' : function(e) {
            // Set collection meta attribute on model's view click event
            app.groups.attr('selected', this.model.cid);
        }
    }

    // ...

});
7
Antipin