2

ParentModel子コレクションを作成するだけでなく、子コレクションを作成する JSON ファイルがありますRecords

ParentModel : Backbone.Model.extend({
  initialize: function() {
    this.set({ records: new Records(this.get("records")) });
  }
});

また、Records コレクションは、Record モデルにマップされる単なる基本的な Backbone コレクションです。

問題は、子が親について知る必要があることです。そのため、各Recordモデルには親プロパティが必要です。したがって、今のところ、初期化メソッドの最後にこれを追加しています。

var self = this;
this.get("records").each(function(record) {
  record.set("parent", self);
});

これは問題なく動作しますが、新しいレコードを作成するときに、これらの 4 行を含めることを覚えておく必要はありません。

This answerは、初期化メソッドをオーバーライドして追加のパラメーターを受け取ることができると言っていますが、BackboneがParentModelをオーバーライドされた初期化メソッドに自動的に渡す方法がよくわかりません。誰かがそれを行う方法の例を提供できますか?

私が望むことを行うのに役立つかもしれないバックボーンリレーショナルについて聞いたことがありますが、それは別の23kbを含める必要があります. それがより良い方法である場合は、それを実装することを検討しますが、それ以外の場合は、利用可能な場合はより単純なソリューションを希望します.

これは、コードを使用して新しいParentModelレコードを作成する場合でも、JSON フィードによって自動的に作成される場合でも機能する必要があります。

4

2 に答える 2

4

私は通常、属性から構造要素を移動する方がクリーンであるため、レコードと親プロパティは属性ではなくオブジェクト上にあることに気付きます。つまり、コレクションと親オブジェクトでさまざまなイベントを利用できます。

var ParentModel = Backbone.Model.extend({
    initialize: function () {
        _.bindAll(this, 'adoptOne', 'adoptAll');
        this.records = new Records();

        this.on('change:records', function () {
             this.records.reset(this.get('records'));
        });
        this.records.on('reset', this.adoptAll);
        this.records.on('add', this.adoptOne);

        this.records.reset(this.get('records'));
    },

    adoptAll: function () {
       this.records.each(this.adoptOne);
    },
    adoptOne: function (model) {
        model.parent = this;
    }
});

いくつかのテスト:

var p = new ParentModel({
    name: "I am the parent",
    records: [{id: 1}, {id: 2}]
});

p.records.add({id: 3});

p.records.each(function (child) {
    console.log(child.get('id')+' '+child.parent.get('name'));
});

p.set({records: [{id: 4}]});

p.records.each(function (child) {
    console.log(child.get('id')+' '+child.parent.get('name'));
});

そしてフィドルhttp://jsfiddle.net/sPXaZ/

于 2012-07-10T16:21:07.443 に答える
1

明確にするために、ここにあなたのニーズの1つの要約があります(これは質問のコメントで見つけることができます):

たとえば、Record要素を中央に配置する場合は、ビューボックスの幅を知る必要があります。それを知る唯一の方法は、最も広いレコード要素が何であるかを知ることです。親オブジェクトは、子要素を並べ替えることでそのことを教えてくれます。

あなたのモデルは問題のある表示を処理しなければならないように私には思えます。バックボーンでの表示はビューによって処理されます。ParentModelしたがって、との両方をリッスンするビューを作成できると思いますRecords

var RecordView = Backbone.View.extend({
  initialize: function() {
    this.collection.on('sync', this.render, this);
  }
  render: function() {
    var widest = this.model.get('width');
  }
});

var view = new RecordView({model: ParentModel, collection: Records});

そして、私の意見では、これはParentModel画面上で取る幅を処理するためではなく、独自のビューに対してです。ここで2つのビューを紹介することがポイントのようです。

しかし、私は全体像を把握していません。ですから、私が間違っている場合は、あなたがやろうとしていることのサンプルをもっと教えてください。

于 2012-07-12T08:00:19.177 に答える