gpt4 book ai didi

javascript - 扩展 Ext.data.Model(动态添加字段)

转载 作者:数据小太阳 更新时间:2023-10-29 03:48:49 28 4
gpt4 key购买 nike

我通过使用原型(prototype)添加字段来扩展现有模型。一切正常,可以从服务器端接收数据并可以在客户端使用。但是,当我现在更新我的数据并将其发送回服务器端时,代理的作者无法识别"new"字段。

更具体地说:我有一个这样的模型:

    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' });

我尝试将 writeAllFields 设置为 false 以获取所有 属性,只有来自已定义模型的属性,而不是添加的属性使用原型(prototype)(Fiddler 证实了这一点)。

现在有人可以在不定义新模型的情况下解决这个问题吗?

提前谢谢你。

最佳答案

我认为最好的解决方案如下:

Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object

我快速浏览了 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);
}
});

然后我检查了定义模型后添加到原型(prototype)的字段的 persist 属性值,结果发现它是 undefined。这是因为您并没有真正创建一个 Ext.data.Field 实例来继承所有 Field 默认值和其他有用的东西,您只是将一个普通对象添加到字段集合中。 Osgaar.prototype.fields 只是一个MixedCollection,因为您直接使用它,所以没有地方可以隐式调用Ext.data.Field 构造函数。 p>

如果您的应用程序逻辑经常动态添加模型字段,请考虑为您的自定义模型实现一个 addField() 方法(在继承链中创建另一个基类)。

希望这对您有所帮助,祝您好运!我使用 ExtJS 已经有一段时间了,所以这对我来说就像一个测验:)

关于javascript - 扩展 Ext.data.Model(动态添加字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com