4

Backbone.ModelGoogle Books API ボリュームを表すこれを取得しました。

    var Book = Backbone.Model.extend({

    defaults: {
        volumeInfo : {
            title: 'n.a.',
            authors: 'n.a.',
            publisher: 'n.a.',
            publishedDate: 'n.a.',
            imageLinks : {
                smallThumbnail: '/unavailable.jpg'
            }
        }
    },

    parse: function(resp) {
        if (resp.volumeInfo.authors) {
            resp.volumeInfo.authors = resp.volumeInfo.authors.join(',');
        }
        return resp;
    }
});

このテンプレートに供給されるもの:

<script type="text/template" id="bookCollectionRow">
    <tr>
        <td><img class="thumbnail" src="<%= volumeInfo.imageLinks.smallThumbnail %>" /></td>
        <td><a target="_blank" href="<%= volumeInfo.canonicalVolumeLink %>"><%= volumeInfo.title %></a></td>
        <td><%= volumeInfo.authors %></td>
        <td><%= volumeInfo.publisher %></td>
        <td><%= volumeInfo.publishedDate %></td>
    </tr>
</script>

テンプレートの解析時に、ボリューム JSON に含まれていない場合、imageLinks次のエラーが表示されます。

Uncaught TypeError: Cannot read property 'smallThumbnail' of undefined.

または でifチェックすることで修正できることはわかっていますが、モデルプロパティの目的は何ですか? オーバーライドしない場合にのみ機能しますか?Modeltemplatedefaultsparse

4

1 に答える 1

10

いくつかのこと。まず、ネストされたオブジェクトを一般的にバックボーン モデルの属性として持つべきではありません。属性を常にアトミックに処理できる場合は問題ありませんが、これはできない場合の完璧な例です。データ モデルの観点からは、imageLinks は独自のバックボーン モデル クラスである必要があり、volumeInfo も同様です。

次に、defaults が{}関数ではなくオブジェクト リテラル ( ) の場合、同じオブジェクトが各モデル インスタンスのデフォルト属性として使用されます。私はあなたがこれを望んでいると思います:

defaults: function(){
    return {
        volumeInfo : {} // should be new VolumeInfo({}) imo
    };
},

しかし、データ モデルはより大きな問題です。インスタンス データをかなりフラットに保たないと、多くの落とし穴に遭遇することになります。

于 2013-07-21T19:14:42.517 に答える