9

バックボーンリレーショナルを使用して、2 つのモデル User と Task の間の関係を作成したいと思います。

2 つのモデルの関係は次のとおりです。

taskModel.creator_id = userModel.id   

// TaskModel
var TaskModel = Backbone.RelationalModel.extend({

    relations: [
        {
            type: Backbone.HasOne,
            key: 'creator',
            keySource: 'creator_id',
            relatedModel: Users
        }
    ],

    // some code
});

// Task collection
var TaskCollection = Backbone.Collection.extend({

    model: TaskModel,

    // some code

});

// User Model
var User = Backbone.RelationalModel.extend({
    // some code
});

実際には、問題は collection.models にあります。添付の​​画像を参照してください

この jsfiddle を確認してください: http://jsfiddle.net/2bsE9/5/

var user = new User(),
    task = new Task(),
    tasks = new Tasks();

task.fetch();
user.fetch();
tasks.fetch();

console.log(user.attributes, task.attributes, tasks.models);

ここに画像の説明を入力

PS:

実際には、requireJs を使用して を取得しているUserModelため、 relatedModel 値に引用符を含めることはできません。

define([
    'models/user',
    'backbone',
    'relationalModel'
], function (User) {
    "use strict";

    var Task = Backbone.RelationalModel.extend({
        relations: [
            {
                type: Backbone.HasOne,
                key: 'creator',
                keySource: 'creator_id',
                relatedModel: User
            }
        ],
    });
);
4

2 に答える 2

4

編集2:

http://jsfiddle.net/2bsE9/13/

以下で提案した変更を反映するように jsfiddle を更新しました。タスクで toJSON を呼び出している限り、サーバーに到達するのは、プロパティがユーザーcreator_idの実際の値に設定された json オブジェクトです。idを使用すると自動的に設定されるとドキュメントに記載されているため、keyDestinationhere は冗長ですkeySource

編集:

https://github.com/PaulUithol/Backbone-relational#keysource

https://github.com/PaulUithol/Backbone-relational#keydestination

https://github.com/PaulUithol/Backbone-relational#includeinjson

上記の 3 つの組み合わせにより、問題が解決する場合があります。

var Task = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasOne,
            // The User object can be accessed under the property 'creator'
            key: 'creator',
            // The User object will be fetched using the value supplied under the property 'creator_id'
            keySource: 'creator_id',
            // The User object will be serialized to the property 'creator_id'
            keyDestination: 'creator_id',
            // Only the '_id' property of the User object will be serialized
            includeInJSON: Backbone.Model.prototype.idAttribute,


            relatedModel: User
        }
    ],
});

ドキュメントには、指定されたプロパティkeySourceまたはkeyDestinationコードで使用されるべきではないことも記載されています。プロパティは属性としてアクセスできません。

これを試して、問題が解決するかどうかコメントしてください。

ところで、バックボーン リレーショナル エンド ツー エンドを使用する素敵なブログ投稿を次に示します。 http://antoviaque.org/docs/tutorials/backbone-relational-tutorial/

于 2012-07-10T13:01:33.480 に答える
0

編集

更新されたjsfiddle

問題は、Backbone-Relational が keySource を明示的に削除して「漏れやすい抽象化を防ぐ」ことです。unsetBackbone-Relational で、属性に対するハードコーディングされた呼び出しがあります。

// Explicitly clear 'keySource', to prevent a leaky abstraction if 'keySource' differs from 'key'.
if ( this.key !== this.keySource ) {
    this.instance.unset( this.keySource, { silent: true } );
}

Taskモデルの unset メソッドを上書きする必要があります。

var Task = Backbone.RelationalModel.extend({
    urlRoot: ' ',

    relations: [
        {
            type: Backbone.HasOne,
            key: 'creator',
            relatedModel: User,
            keySource: 'creator_id'
        }
    ],

    unset: function(attr, options) {
        if (attr == 'creator_id') {
          return false;
        }

        // Original unset from Backbone.Model:
        (options || (options = {})).unset = true;
        return this.set(attr, null, options);
     },

    sync: function (method, model, options) {
        options.success({
            id: 1,
            name: 'barTask',
            creator_id: 1
        });
    }
});

Backbone.Model.unsetこのアプローチの明らかな問題は、Backbone がメソッドを変更した場合、または Backbone-Relational がそのkeySource動作を変更した場合に、コードを変更する必要があることです。

于 2012-07-10T05:12:40.290 に答える