3

次のような単純なBackboneモデルがあります。

(function () {

    App.Company = Backbone.Model.extend({
        defaults: {},

        urlRoot: "/Contacts/Companies",

        initialize: function () {
            var contactPersons = this.get("ContactPersons") || [];

            this.set("ContactPersons", new App.ContactPersonCollection(contactPersons));
        }
    });

})();

モデルをサーバーに保存するたびに、ContactPersonsコレクションはにリセットされますArray

モデルを保存した後、手動でコレクションに変換する必要が本当にありますか?

更新:これは意図したとおりに機能します-より良いアプローチについては回答を参照してください(IMHO)

(function () {

    App.Company = Backbone.Model.extend({
        defaults: {},

        urlRoot: "/Contacts/Companies",

        initialize: function () {
            var contactPersons = this.get("ContactPersons") || [];

            if (_.isArray(contactPersons)) {
                this.set("ContactPersons", new App.ContactPersonCollection(contactPersons));
            }
        },

        parse: function (response) {

            if (response.ContactPersons && _.isArray(response.ContactPersons)) {
                response.ContactPersons = new App.ContactPersonCollection(response.ContactPersons);
            }

            return response;
        }
    });

})();
4

1 に答える 1

2

サーバーからデータを送り返すとき、応答をどのように処理していますか?たとえば、[{}、{}、{}]を返送するだけの場合、Backboneがそれをコレクションとして扱うことを自動的に認識しているとは思いません。したがって、ContactPersons属性を取得するもの、つまりバニラ配列として設定します。

できることは、モデル内のset関数をオーバーライドすることです。これにより、渡されたオブジェクトの配列が取得され、コレクションに適切に書き込まれます。この例を参照してください。

set: function(attributes, options) {

    if (_.has(attributes, 'ContactPersons') && this.get("ContactPersons")) {
        this.get('ContactPersons').reset(attributes.ContactPersons);
        delete attributes.ContactPersons;
    }

    return Backbone.Model.prototype.set.call(this, attributes, options);
}

したがって、基本的に、サーバーの応答が適切に名前空間化されている限り(response.ContactPersons)、解析後、応答はset関数に渡されます。コレクションデータは、特別にコレクションとして扱われます。ここでは、新しいデータですでに存在するコレクションをリセットしています。他のすべてのモデル属性は、引き続き元のに渡される必要がありますset()

更新-自分の答えについて疑問が高まっている

私はこの質問/答えを頭から離れることができませんでした。set()それは確かに機能しますが、変更されたものを使用するのではなく、単に物事を行うのが良いと私は確信していparse()ません。set()変更されたモデルとネストされたモデルの使用の違いについて誰かがコメントを持っている場合はparse()、入力を歓迎します。

于 2012-08-27T14:10:06.593 に答える