Dan*_*iel 7 javascript backbone.js
在我的Backbone应用程序中,我有一个由几个子模型组成的模型作为参数.
我这样定义它:
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(),
} );
}
});
Run Code Online (Sandbox Code Playgroud)
问题在于获取和保存.当我获取时,例如JSON响应包括一个对象info,一个数组logins和一个对象billing.Backbone自动将它们分配为普通参数,这意味着子模型被简单对象覆盖.
我目前的解决方案是覆盖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);
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于获取.并且由于在调用save()方法时返回创建的模型的更新状态,我还必须覆盖该save()方法.
有没有什么好方法可以解决这个问题?
也许覆盖这个set()方法可能有用,但是我担心这意味着我会开始误入Backbone代码库.
我也考虑过使用像这样的解析方法
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;
}
Run Code Online (Sandbox Code Playgroud)
这将创建对已更新的子模型的引用.
我通常用于parse子模型,如第二个示例所示(但请注意,您需要response在最后返回)。我认为这在概念上是准确的,因为parse是将服务器端表示转换为客户端表示的适当位置。我相信这也应该有效save,尽管我还没有测试过它,因为parse在保存响应时也被调用。
根据我的经验,覆盖set只不过是麻烦 - 它往往会产生意想不到的副作用,最好避免。
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |