1

サーバーから取得したJSONが、モデルの外観と正確に1対1ではないBackboneアプリケーションがあります。モデルにカスタム解析関数を使用しています。例:

parse: function(response) {
   var content = {};
   content.id = response.mediaId;
   content.image = response.image.url;
   return content;
}

これは機能します。ただし、場合によっては、API呼び出しがあり、一度に多くの情報を取得します。たとえば、画像に関する情報usercomments

{
    "mediaId": "1",
    "image": {
        "title": "myImage",
        "url": "http://image.com/234.jpg"
    },
    "user": {
        "username": "John"
    },
    "comments": [
        {
            "title": "Nice pic!"
        },
        {
            "title": "Great stuff."
        }
    ]
}

ここから新しいユーザーモデルとコメントコレクションを作成するにはどうすればよいですか?これはオプションです:

parse: function(response) {
   var content = {};
   content.id = response.mediaId;
   content.image = response.image.url;
   content.user = new User(response.user);
   content.comments = new Comments(response.comments);
   return content;
}

ここでの問題は、new Userまたはnew Commentsを入力として生のJSONを使用して作成することにより、BackboneがJSONプロパティを属性として追加するだけであるということです。parse代わりに、オブジェクトの構造を制御するための中間的な方法が必要です。オプションは次のとおりです。

parse: function(response) {
    // ...
    content.user = new User({
        username: response.user.username
    });
    // ...
}

...しかし、それはあまり乾燥防止ではありません。

だから、私の質問は、モデル/コレクションの属性を制御して、1つのJSON応答からいくつかのモデル/コレクションを作成するための良いパターンは何でしょうか?

ありがとう!

4

1 に答える 1

1

それは可能な限り良い方法ではないかもしれませんが、これは私がそれを行う方法です:

content.user = new User(User.prototype.parse(response.user));

唯一の問題は、のthisコンテキストUser.parseが間違っていることです。コンストラクターに特定のコードがない場合は、次のUserこともできます。

content.user = new User();
content.user.set(user.parse(response.user));

また、Backboneバージョン0.9.9の変更ログに興味深いメモがあることに気づきました。

解析関数は、Ajax呼び出しの後だけでなく、コレクションとモデルの両方に対して、定義されている場合は常に実行されるようになりました。

Modelそして、コンストラクターのソースコードを見ると、次のCollectionようになっています。

if (options && options.parse) attrs = this.parse(attrs);

たぶん0.9.9にアップグレードすると、必要なものが得られますか?アップグレードがオプションでない場合は、もちろん、独自のコンストラクターで同じものを実装できます。

于 2012-12-14T12:51:01.830 に答える