Javascript 扩展Ext.data.Model(动态添加字段)
我通过使用原型添加字段来扩展现有模型。一切正常,数据可以从服务器端接收,也可以在客户端使用。但是,当我现在更新数据并将其发送回服务器端时,“新”字段不会被代理的编写者识别 更具体地说:我有这样一个模型:Javascript 扩展Ext.data.Model(动态添加字段),javascript,model,extjs4,Javascript,Model,Extjs4,我通过使用原型添加字段来扩展现有模型。一切正常,数据可以从服务器端接收,也可以在客户端使用。但是,当我现在更新数据并将其发送回服务器端时,“新”字段不会被代理的编写者识别 更具体地说:我有这样一个模型: Ext.define('Osgaar', { extend: 'Ext.data.Model', fields: [ { name: 'first', type: 'string' }, { name: 'second', type
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
}
}
});
我是这样扩展模型的:
Osgaar.prototype.fields.add({ name: 'fourth', type: 'string' });
我试图将writealFields
设置为false
以传输所有属性,只有来自定义模型的属性,而不是使用原型添加的属性(Fiddler确认)
现在有没有人能在不定义新模型的情况下解决这个问题
提前谢谢。我认为最好的解决方案如下:
Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object
Osgaar_Temp = Osgaar;
delete Osgaar;
Ext.define('Osgaar', {
extend: 'Osgaar_Temp',
fields:
[
{ name: 'typeCategories', type: 'string' }
]
});
我快速查看了实现,下面是写入数据时由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);
}
});
getRecordData:函数(记录){
var isPhantom=record.phantom==true,
writeAll=this.writeAllFields | | isPhantom,
nameProperty=this.nameProperty,
fields=record.fields,//我为我的原始问题找到了另一个解决方案
我没有将字段添加到模型的原型中,而是执行了以下操作:
Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object
Osgaar_Temp = Osgaar;
delete Osgaar;
Ext.define('Osgaar', {
extend: 'Osgaar_Temp',
fields:
[
{ name: 'typeCategories', type: 'string' }
]
});
这似乎是最好的解决方案。这就是解决方案。在定义本身中添加字段似乎会将persist
设置为true
(这可能是由模型管理器完成的,但尚未对此进行研究)。当通过prototyp添加此项时,必须手动设置。非常感谢!我更新了答案,看到了更好的解决方案,并进行了更多的研究。感谢您提供的其他解释。这对我来说很有意义。我将尝试:)顺便说一句,您不需要在新的Ext.data.Field()中添加“persist:true”构造函数,因为它在默认情况下已经是真的。每次这样做时,您都会向继承链添加另一个节点,这在最佳情况下可能会导致性能下降。我不会称此解决方案为可靠解决方案,此外,它的代码行数比直接向字段集合添加字段要多。它只调用一次,所以我不能这样做ee这里有一个问题。是的,可能会有更多的代码行,但这似乎是一个更漂亮的解决方案,因为您可以使用默认行为而无需做任何特殊的事情,我不认为这个解决方案很漂亮,您基本上是在对类继承框架进行黑客攻击以获得所需的结果。最终您会得到一个从中继承的类自己