9

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

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

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

我试图设置writeAllFieldsfalse转移所有属性,只有定义模型中的属性,而不是使用原型添加的属性(Fiddler 证实了这一点)。

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

先感谢您。

4

2 回答 2

12

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

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

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

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

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

于 2012-05-28T20:05:20.750 回答
1

我为我的原始问题找到了另一种解决方案。

我没有将字段添加到模型的原型中,而是执行了以下操作:

Osgaar_Temp = Osgaar;
delete Osgaar;

Ext.define('Osgaar', {
    extend: 'Osgaar_Temp',
    fields: 
    [
        { name: 'typeCategories', type: 'string' }
    ]
});

这似乎是最好的解决方案。

于 2012-06-04T14:29:21.833 回答