7

私のバックボーン アプリケーションには、パラメーターとしていくつかのサブモデルで構成されるモデルがあります。

私はそれを次のように定義します。

app.Models.Account = Backbone.Model.extend({

    initialize : function( ) {
        this.set( { 
                info     : new app.Models.Info(),
                logins   : new app.Collections.Logins(),
                billing  : new app.Models.Billing(),
            } );
    }

});

問題は、フェッチして保存するときです。たとえば、JSON 応答には のオブジェクトinfo、配列のオブジェクト、オブジェクトのオブジェクトが含まれていloginsますbilling。バックボーンはそれらを通常のパラメータとして自動的に割り当てます。これは、サブモデルが単純なオブジェクトでオーバーライドされることを意味します。

fetch私の現在の解決策は、モデルのメソッドを次のようにオーバーライドすることです。

    fetch: function( options ) {
      options = options ? _.clone(options) : {};
      var model = this;
      var success = options.success;
      options.success = function(resp, status, xhr) {
        resp = model.parse( resp, xhr );

        model.get('info').set(resp.info);

        model.get('logins').reset(resp.logins);

        model.get('billing').set(resp.billing);

        if (success) success(model, resp);
      };

      options.error = Backbone.wrapError(options.error, model, options);
      return (this.sync || Backbone.sync).call(this, 'read', this, options);
    }

ただし、これはフェッチ専用です。また、メソッドを呼び出すと、作成されたモデルの更新されたステータスが返されるため、save()メソッドもオーバーライドする必要がありますsave()

この問題を解決するための良いアプローチはありますか?

おそらくset()メソッドをオーバーライドすることでうまくいくかもしれませんが、バックボーンのコードベースから逸脱し始めていることを意味するのではないかと心配しています。

parse メソッドを使用することも考えました

    parse : function ( response ) {
        this.model.get('info').set(response.info);
        response.info = this.model.get('info');

        this.model.get('logins').reset(response.logins);
        response.logins = this.model.get('logins')

        this.model.get('billing').set(response.billing);
        response.billing = this.model.get('billing');

        return response;
    }

これにより、すでに更新されたサブモデルへの参照が作成されます。

4

1 に答える 1

3

私は通常parse、2番目の例のように、サブモデルに使用します(ただし、最後に戻る必要があることに注意してくださいresponse)。parseサーバー側の表現をクライアント側の表現に変換するための適切な場所であるため、これは概念的に正確だと思います。保存応答でも呼び出されるsaveため、テストはしていませんが、これも機能するはずです。parse

私の経験では、オーバーライドsetは問題に他なりません。意図しない副作用が発生する傾向があるため、回避することをお勧めします。

于 2012-11-23T22:07:21.897 に答える