8

わからないwtfの問題があります。私は説明する :

Product という名前のモデルがあります:

var Product = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        user_id: null,
        is_buy_it_now: ''
    },

    relation: [{
        type: Backbone.HasOne,
        key: 'user_id',
        relatedModel: User,
        autoFetch: true
    }]
});

私のフィールドuser_idは、1人のユーザー(バックボーンのモデルでもあります)の外部キーです:

var User = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    }
});

私のフェッチ関係は、それぞれのモデルで完全に機能します。しかし、Product.user_idと User モデルの間にリレーションを配置すると、wtf エラーが発生します。

私は可能な限りすべてを試しました:すべてのキー(keySourcekeyDestination..........可能なすべての値で)。何が起こったのかを監視できるように、Relation Lib にブレークポイントを設定しました ... 言うことはありません。StackOverflow でさえ、このバグを知りません :P (または、ひどく検索しました)

最終的な問題は次のとおりです。

  • 私の製品は API によって正しく送信され、バックボーン (OK) に設定されます。
  • フィールドuser_idは、最初に製品 API 応答によって数値に設定され、次にオブジェクト ユーザーに置き換えられるのではなく、リレーショナルによって NULL に設定されます (なぜ?)
  • ネットワーク デバッガを見ると、Relational は User オブジェクトの API を呼び出します (ここで問題ありuser_idません)。サーバーの応答は良好で、JSON に適切なユーザーが含まれています (OK)。しかし、リレーショナルはこの応答オブジェクトを field にバインドしませんuser_id。これは現在 .... NULL (NOT OK) です。
    • そのため、 User オブジェクトが失われました (ただし、 autoFetch に成功関数を入れた場合は console.log() できます)、フィールドで親の Product に正しくリンクされていませんuser_id

EDIT : JSFiddle はhttp://jsfiddle.net/gjdass/WNWrm/で利用できます(注意してください。API は応答に時間がかかる場合があります。約 10 秒です。これは正常です)。

よろしくお願いします :/ お時間をいただき申し訳ありません。

4

3 に答える 3

1

のデフォルト値を削除すると、動作が異なりますuser_idか? リレーションを取得してから、デフォルト値の を適用しているのかと思いますnull

まだ設定されていない場合は設定Backbone.Relational.showWarningsしてみて、コンソールに警告がないか確認してください。true

于 2014-03-29T23:49:20.713 に答える
0

これを試してみてください:

    relations: [{
        type: Backbone.HasOne,
        key: 'id',
        keyDestination: 'user_id',
        includeInJSON: 'user_id',
        autoFetch: true,
        relatedModel: User
    }]

バックボーン関係のドキュメンテーションの頭も尻尾も作れませんでした。どうやらkey関連モデルのIDを参照することになっているようですが、どの例でもそれを行っていないようです。彼らの例が実際に機能するのだろうか?とにかく、これで問題が解決すると思います。key関連するモデルと設定からキーに設定するkeyDestinationincludeInJSON、結果を設定して製品オブジェクトにシリアル化する方法がわかります。

于 2014-04-05T15:46:41.357 に答える
0

そのため、バックボーン リレーショナル ドキュメントをよく見ると、HasOne と HasMany の reverseRelation の例がどれも含まれていないことに気付くでしょう。そのため、機能はテストされておらず (あなたを除いて!)、機能していないようです。他の方法で関係を試してください。

var User = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    },

    relations: [{
        type: Backbone.HasMany,
        key: 'products',
        relatedModel: 'Product',
        reverseRelation: {
            key: 'id',
            keySource: 'user_id',
            keyDestination: 'user_id',
            includeInJSON: true
        }            
    }]            
});
// Product Model
var Product = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        is_buy_it_now: '',
        user_id: null
    }        
});
于 2014-04-06T15:43:28.443 に答える