私のバックボーン アプリケーションには、パラメーターとしていくつかのサブモデルで構成されるモデルがあります。
私はそれを次のように定義します。
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;
}
これにより、すでに更新されたサブモデルへの参照が作成されます。