1

投稿とそのコメントを操作するアプリを作成するために、RESTful JSON API で Backbone を使用しています。Backbone Relational を機能させようとしてきましたが、遅延読み込みで問題が発生しました。

関連するコメントなしで、投稿のリストを読み込みます。リスト内の投稿をクリックすると、コメントを含めた完全な投稿を取得し、これをレンダリングするビューが開きます。

2 つの Backbone.RelationModels、投稿、およびコメントがあります。コメントへの投稿関係は次のように設定します:`

relations: [{
            type: Backbone.HasMany,
            key: 'comments',
            relatedModel: 'Comment',
            includeInJSON: true, // don't include it in the exporting json
            collectionType: 'Comments'
        }]

今私が直面している問題は、まだコメントが含まれていないリストを取得するとすぐに関係が初期化されることです。URI でモデルを取得して、後で完全なデータをロードします。ただし、関係は再初期化されないようです。Posts.get(1).get('comments') を呼び出すと、空のコメント コレクションが返されます。

この問題に最もうまく取り組む方法を誰かが知っていますか? データはありますが、コメントのコレクションが更新されていないようです。

編集: Post モデルに change:comments をそれ自体にバインドさせて、コレクションを更新することができます。ただし、 this.get('comments') は Comments コレクションを返すため、元のコメントの JSON を取得する確実な方法を見つけることができないようです。

注: 私のコレクションでは、次のコードを使用して JSON を解析し、API で動作するようにします。

parse: function(response) {
        var response_array = [];
        _.each(response, function(item) {
            response_array.push(item);
        });

        return response_array;
    }

これは、API によって返される JSON が、ネイティブの JSON 配列ではなく、インデックス付きキー (連想配列) を持つオブジェクトを返すためです。

{
    "id" : "1",
    "title" : "post title",
    "comments" : {
        "2" : {
            "id" : "2",
            "description": "this should solve it"
        },
        "6" : {
            "id" : "6",
            "description": "this should solve it"
        }
    }
}

本当にありがとう!質問があれば聞いてください。どこかで漠然としていると思います。

4

2 に答える 2

3

バックボーンリレーショナルモデルは、配列以外のコレクションを解析しません。私の質問のJSONは機能しませんでした。コメントを適切な配列で返すようにバックエンドを変更しました

{
    "id" : "1",
    "title" : "post title",
    "comments" : [
        {
            "id" : "2",
            "description": "this should solve it"
        },
        {
            "id" : "6",
            "description": "this should solve it"
        }]
    }
}

RelationalModelは、JSONが先に進む前にJSONを解析するためにBackboneが提供する解析関数を尊重しません。バックエンドが「適切な」JSONを返すため、遅延読み込みは余分なコードなしで機能します。

于 2011-09-12T19:06:42.563 に答える
1

コメント モデルで initialize メソッドを使用して、parse メソッドをシミュレートし、次のようなカスタム値で属性を定義することもできます (CoffeeScript):

initialize: (obj) ->
  @attributes = obj.customKey 
于 2012-04-30T19:21:00.017 に答える