LaO*_*aar 9 javascript model extjs4
我通过使用原型添加字段来扩展现有模型.一切正常,数据可以从服务器端接收,可以在客户端使用.但是,当我现在更新我的数据并将其发送回服务器端时,代理的编写者无法识别"新"字段.
更具体一点:我有一个这样的模型:
Ext.define('Osgaar', {
extend: 'Ext.data.Model',
fields: [
{ name: 'first', type: 'string' },
{ name: 'second', type: 'string' },
{ name' 'third', type: 'string' }
],
proxy: {
type: 'rest',
url: 'public/svcmethod',
reader: {
type: 'json',
root: 'data'
},
writer: {
type: 'json',
writeAllFields: false
}
}
});
Run Code Online (Sandbox Code Playgroud)
我正在扩展模型:
Osgaar.prototype.fields.add({ name: 'fourth', type: 'string' });
Run Code Online (Sandbox Code Playgroud)
我试图设置writeAllFields为false传递所有属性,只有来自定义模型的那些,而不是使用原型添加的那个(Fiddler确认).
现在有人在不定义新模型的情况下解决这个问题吗?
先感谢您.
Dmi*_*ich 12
我认为这里最好的解决方案如下:
Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object
Run Code Online (Sandbox Code Playgroud)
我快速浏览了Writer实现,这是一个在写入数据时由write()调用的方法:
getRecordData: function(record) {
var isPhantom = record.phantom === true,
writeAll = this.writeAllFields || isPhantom,
nameProperty = this.nameProperty,
fields = record.fields, // <- look here
data = {},
changes,
name,
field,
key;
if (writeAll) {
fields.each(function(field){
if (field.persist) { // <- checks the persist property!
name = field[nameProperty] || field.name;
data[name] = record.get(field.name);
}
});
Run Code Online (Sandbox Code Playgroud)
然后我检查了在定义模型后添加到原型的字段的persist属性的值,结果是未定义的.这是因为你并没有真正创建一个Ext.data.Field实例来继承所有的Field默认值和其他有用的东西,你只需要在field集合中添加一个普通的Object.Osgaar.prototype.fields只是一个MixedCollection,因为你直接使用它,所以没有可以隐式调用Ext.data.Field构造函数的地方.
如果应用程序逻辑通常会动态添加模型字段,请考虑对自定义模型实现addField()方法(在继承链中创建另一个基类).
希望这有帮助,祝你好运!我一直在使用ExtJS一段时间,所以这对我来说就像一个测验:)
| 归档时间: |
|
| 查看次数: |
7968 次 |
| 最近记录: |