4

我们有一个客户需要相当复杂的数据模型。这意味着数据模型不仅非常庞大(大约 500-1000 个字段,嵌套在许多对象中),还需要在任何时候发送和接收所有数据,这就是字段发生变化(在失去焦点之后)。我们将其全部作为 JSON 获取。这是一个结构示例:

{
    data: {
        somefield: 'some content'
    },
    label: {
        somelabel: 'some label text'
    },
    applyable: {
        somefield: {
            visible: false
        }
    }
    someSubForm: {
        data: {
            somefield: 'some content'
        },
        label: {
            somelabel: 'some label text'
        },
        anotherSubForm: {
            data: {
                somefield: 'some content'
            },
            label: {
                somelabel: 'some label text'
            }
        }
    }
}

但这还不是全部;该模型还包含标签、工具提示和其他配置。所有数据都需要显示在多个选项卡中,其中可能会在两个不同的选项卡中显示相同的数据。由于所需的布局(由客户定义),表单将相互嵌套。

后端由我们的客户提供,因此我无法在此处更改任何内容。

我首先使用具有已定义代理的单个模型来加载 JSON。但在那之后我遇到了几个问题。

首先是表单将始终跟踪所有字段,即使是嵌套表单也是如此。其次是我无法更改任何标签或应用自定义设置第三是由于数据量巨大,loadRecord() 和 getValues() 方法运行良好长。

我的问题是如何将其分解,以便每个表单仅处理其自己的数据而不是所有数据,以及如何应用自定义设置?

4

2 回答 2

3

这是我现在使用的解决方案:

首先是一些事实:

  1. 我将不得不涵盖多个 R/W 操作(特别是在每个更改并失去焦点的字段之后)
  2. 我总是在每个请求上取回所有数据
  3. 我必须涵盖大量数据(字段数据、存储数据、标签和配置)
  4. 我必须优化这个烂摊子以提高性能
  5. 无法在服务器端会话中存储任何内容
  6. 表单被疯狂地嵌套在一起,也可能被拆分或存在两次

这是我现在要做的:

我放弃了所有关联,并决定只使用一个从模型扩展而来的模型,该模型具有getData支持自定义根属性的修改方法someSubForm(请参阅问题中的示例代码)。这些字段配置为自动,因此需要更改读取器或写入器。也许不是坚如磐石,但它确实有效。

下一个大问题是表格。表单将始终尝试设置每个字段,即使它位于另一个表单中。另外我需要设置很多独立的标签。所以不能使用默认形式,我应该扩展吗?但是我应该如何以及从哪里开始呢?经过长时间查看源代码后,在我看来我无法扩展,所以我决定创建一个完全自定义的表单类以及自定义 mixin 类和自定义 form.basic 类。为什么?因为我需要表单只查看直接放入该表单的字段,所以能够设置标签并将模型实例交给任何嵌套表单。

有了它,我现在可以使用自定义选择器注册我自己的监视器实例。哦,我忘记了关于我的新表格的第一件事;它通过包含名称(如someSubForm)的属性绑定到实体。

这用于

  1. 一个项目被添加到表单中
    • 任何字段都获得一个 formId
    • 任何标签都会获得一个 formId(不是绑定到表单的标签)
    • 任何表单都会获得 parentFormId 和实例
  2. 监视器选择器已设置
  3. 将模型加载到表单中
  4. 从模型中获取数据

其次是现在有 3 个监控实例

  1. 使用同样查找实体的新选择器收集所有字段。这样任何子表单字段都会被忽略,因为它们有自己的实体
  2. 标签都一样
  3. 收集所有表格

三是修改loadRecord方法,使用模型的新getData()方法,将特定数据设置为字段、标签,将整个模型设置为任意形式。

总而言之,我的性能提升了 800%。

于 2013-06-17T07:41:56.343 回答
2

由于您无法拆分 JSON,因此您需要一个用于 web 服务 i/o 的单一模型:这就是您已经拥有的。

但是当用户使用数据时,您应该专注于所需的数据,以减少加载和更新所花费的时间。因此,我建议定义其他模型和商店,以支持您的每个选项卡或选项卡中的每个表单。给定您的数据样本,您可以例如创建一个表单模型,该模型是在您的大 i/o 模型通过复制数据加载(在回调中或您侦听加载事件)之后创建的。您甚至可以将这种昂贵的复制操作推迟到用户打开相应选项卡的那一刻。

我看到有一个子表单,所以也许您可以尝试将关联添加到表单模型本身。

Ext.define('YourApp.model.FormModel', {
extend: 'Ext.data.Model',
fields: [
    { name: 'data'},
    { name: 'label'}
],
associations: [ {
        type: 'hasMany',
        model: 'YourApp.model.FormModel',
        associationKey: 'someSubForm' 
    }
]
});
于 2013-06-13T08:57:31.547 回答