【问题标题】:Can we avoid setting additional fields in Model?我们可以避免在模型中设置额外的字段吗?
【发布时间】:2021-11-17 00:43:20
【问题描述】:
Ext.define('User', {
  extend: 'Ext.data.Model',
  fields: [
    {name: 'name',  type: 'string'}
  ]
});
Ext.create('User', { 'name' : 'A', 'createdBy': 'Random' });

EXTJS 4.1 在创建记录时忽略“createdBy”字段。 在 7.4 中,它还保存了其他(未配置)字段。

7.4 中的输出

{
  "name": "A",
  "createdBy: "Random"
}

我们可以通过任何配置避免这种情况(在记录数据中具有“createdBy”)吗?

【问题讨论】:

  • 到底是什么问题?您不想在模型实例中看到此字段,或者您想在将数据发送到后端时跳过未定义的字段?
  • @PeterKoltai,我不想在模型实例中看到其他字段。在 4.1 中,getData() 返回包含所有已配置字段的对象,即使我们使用部分数据创建记录,其余字段也保持“未定义”。在 7.4 中,配置字段并不严格,实例只有我们在创建时传递的那些字段。
  • 是的,我认为这种行为已经改变。但是您可以创建自定义 JSON 读取器和写入器,以在读取或写入数据时排除未定义的字段。
  • Here 例如:Fields will automatically be created at read time for any for any keys in the data passed to the Model's proxy's Ext.data.reader.Reader whose name is not explicitly configured in the fields config.
  • @PeterKoltai,我们目前正在将 Ext 从 4.* 升级到 7.*。由于多种原因(例如,在多个位置进行更改、在未来的升级中必须维护覆盖等),编写自定义 JSON 读取器/写入器或覆盖模型是最不受欢迎的选项。我认为他们没有对此更改提供任何解释,我也搜索了更改日志。只是希望如果有人能提供更好的方法,否则我想要的是覆盖。

标签: extjs extjs7


【解决方案1】:

在浏览了很多版本的发行说明之后,我发现了这个。

Migration Guide - EXTJS 4.2 to 5.0

它提到了以下覆盖,这将恢复记录创建的行为。

Ext.define('App.overrides.data.Model', {
    override: 'Ext.data.Model',
    constructor: function (data) {
        this.raw = Ext.apply({}, data);
        this.callParent(arguments);
    }
});

我对动态字段创建没有问题,但如果他们将其作为可配置行为引入或提供类似的字段映射以在 writer 中处理会更好。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多