0

私はbackbone.jsを使用していますが、次の未解決の状況
があります。2つのモデルがあると仮定します。

var Person = Backbone.model.extend({
    defaults: {
        name: '',
        age: 24
    }
});

var Car = Backbone.model.extend({
    defaults: {
        type: '',
        driving_person: null
    }
});

そして、私はajax呼び出しで呼び出すことができるサービスを持っており、それは次の形式で車のjsonを返します。

{
    car: {
        type: 'Honda Civic',
        driving_person: {
            name: 'dan',
            age: 13
        }
    }
}

そのサービスを参照するurlRootプロパティも車のモデル内に追加します。
ここで、fetchを使用して特定の車をロードしたいのですが、driving_personプロパティにpersonMODELを含む車のモデルを取得したいと思います。どうすればこれを達成できますか?

4

1 に答える 1

0

車のモデルには、そのデータを取得してバックエンドで埋め込みを行うことができるように、user_id または user_name またはそのようなプロパティが含まれている必要があります。

parse()また、モデルのメソッドを利用する必要があります。それをオーバーライドして、サーバーからの json 応答を解析します。解析すると、ユーザー モデルがバックボーンに自動的に作成されます (または、既に作成されている場合はそれを参照します)。

しかし、カーモデルを作成しながら、その方法でこれを行うこともできると思いますinitialize()

それはさらに良いかもしれません。

ただし、サーバーからデータを要求するときに、ユーザーに基づいて適切な車を選択する方法を求めている場合、このロジックはサーバー側にあります。サーバー側で実装する必要があります。

json 応答のように、クライアント側のモデル内に Driving_person を埋め込みたい場合は、riving_person プロパティを定義するだけで、値として json オブジェクトが含まれます。

車のモデルに新しい Backbone.Model を埋め込む場合は、車のモデルを処理する必要がありますinitialize()。または多分parse()

編集:

フェッチ後にユーザー モデルを車のモデルに埋め込みたい場合は、コンストラクター メソッドをオーバーライドする必要があります。

var Car = Backbone.Model.extend({

    constructor: function(data, options){
        this.driving_person = new User(data.driving_person);
        delete data.driving_person;
        Backbone.Model.prototype.constructor.call(this, data);
    }

    /// Your other model code like initialize, etc.

編集2:

車ごとに新しいドライバー モデルを作成することを避けたい場合 (より多くの車が同じドライバーを共有する可能性があるため)、ドライバー モデルを取得するグローバル変数 (またはコレクション) を使用する必要があります。

これは、コードの前半で定義されたグローバル コレクションである必要があります。

次に、私が提供したこのコンストラクター内のグローバル コレクションにドライバーを追加します。

コードの早い段階でグローバルな DriverCollection を定義したとしましょう (これは次のように行います:

window.DriverCollection = Backbone.Collection.extend({
    model: Driver,

次に、車のモデルを次のように作成します。

var Car = Backbone.Model.extend({   
    constructor: function(data, options){           
        if (!window.DriverCollection.find(function(driver){return driver.name == data.driving_person.name;}))
        {window.DriverCollection.add(driving_person);}
        data.driving_person = data.driving_person.name;
        Backbone.Model.prototype.constructor.call(this, data);
    }       
    /// Your other Car model code like initialize etc.

このように、Car コンストラクターは JSON データを受け取り、ドライバーが存在しない場合はグローバル DriverCollection に追加し、車のdriving_personプロパティをname埋め込まれた json ドライバー オブジェクトのプロパティに設定します。

もちろん、id などの他のプロパティを使用して、ドライバーを参照およびシークすることもできます。

これにより、重複を回避できます。

これを機能させるには、Driver モデルを定義する必要があります。

于 2012-11-14T19:34:54.180 に答える