Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展Ext.data.Model(动态添加字段)_Javascript_Model_Extjs4 - Fatal编程技术网

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这里有一个问题。是的,可能会有更多的代码行,但这似乎是一个更漂亮的解决方案,因为您可以使用默认行为而无需做任何特殊的事情,我不认为这个解决方案很漂亮,您基本上是在对类继承框架进行黑客攻击以获得所需的结果。最终您会得到一个从中继承的类自己