【问题标题】:Composite components复合组件
【发布时间】:2019-02-15 01:04:11
【问题描述】:

我想创建一个组合其他现有组件的组件。下面是一个简化的例子:

Ext.define('CCC.ThreeNames', {
    extend: '???',
    alias: 'widget.threenames',
    items: [
        {
            xtype: 'textfield',
            label: 'First',
            itemId: 'first',
            name: 'first'
        },
        {
            xtype: 'textfield',
            label: 'Middle',
            itemId: 'middle',
            name: 'middle'
        },
        {
            xtype: 'textfield',
            label: 'Last',
            itemId: 'last',
            name: 'last'
        }
    ]
});

假设我想使用它:

items: [
    {
        xtype: 'threenames',
        itemId: 'applicant',
        name: 'applicant'
    },
    {
        xtype: 'threenames',
        itemId: 'dependent',
        name: 'dependent'
    }
]

首先,我从什么扩展????我在想xtype: 'fieldset',但这种类型不被视为表单字段,因此当您通过getValues 提取数据时,它会跳过字段集并向下迭代到文本字段。文本字段不“知道”它们的上下文,因为那是在父元素中,所以它们只报告为 firstmiddlelast,现在数据集中有重复的字段。

我在初始化期间在想,也许父组件会使用 name 并在它们前面加上自己的 name,例如firstmiddlelastapplicant.firstapplicant.middleapplicant.last 等,但这样会弄乱使用 name 的组件中的任何代码。

如何处理?我们真的希望能够重用一些复杂的复合组件,这样我们的设计人员就不必一直手动编写代码,并且让组件作为一个独立的单元来保存和检索数据,例如@987654339 @ 拉出数据,对复合组件一无所知。

非常感谢这个问题的解决方案。

关于 Coderino Javarino 建议的可能重复:这个问题不是那个问题的重复。该组件能够对两个字段使用单个值,即日期字段将值解释为日期,时间字段将值解释为时间。实际上,它实际上只是具有自定义显示类型的单个组件。

【问题讨论】:

  • @CoderinoJavarino - 不是那个的副本。该组件能够对两个字段使用单个值,即日期字段将值解释为日期,时间字段将值解释为时间。实际上,它实际上只是具有自定义显示类型的单个组件。
  • 什么是“申请人”和“依赖”?加载记录的嵌套数据?您能否在示例中包含模型。
  • @SvenLiivak - threenames 的实例。没有模型,所见即所得。

标签: extjs extjs6


【解决方案1】:

命名字段请求的方式是一项简单的任务:

Ext.define('CCC.ThreeNames', {
    extend: 'Ext.container.Container', //you can use Ext.form.Panel for additional functionality
    alias: 'widget.threenames',
    items: [
        { xtype: 'textfield', itemId: 'first', name: 'first', fieldLabel: 'First' },
        { xtype: 'textfield', itemId: 'middle', name: 'middle', fieldLabel: 'middle' },
        { xtype: 'textfield', itemId: 'last', name: 'last', fieldLabel: 'last' },
],
    listeners: {
        beforerender: function() {
            let self = this;
            this.query('textfield').forEach(function(field){
                field.name = self.name + '.' + field.name;
                field.itemId = field.name;
            });
        }
    }
});

使用这样的命名是完全不同的事情。但正如我从您的评论中了解到的那样,没有使用 MVC 模式,那么这个解决方案应该会给出预期的结果。

【讨论】:

  • 仅供参考,我确实提到过 name 不是理想的解决方案。虽然上面的组件没有与之关联的模型,但我不能保证总是如此。
【解决方案2】:

这是实现您想要的推荐的方法

Ext.define('CCC.ThreeNames', {
extend: '???',
**xtype: 'threenames',**
alias: 'widget.threenames',
items: [
    {
        xtype: 'textfield',
        label: 'First',
        itemId: 'first',
        name: 'first'
    },
    {
        xtype: 'textfield',
        label: 'Middle',
        itemId: 'middle',
        name: 'middle'
    },
    {
        xtype: 'textfield',
        label: 'Last',
        itemId: 'last',
        name: 'last'
    }
]});

现在可以这样使用了

items: [
    {
        xtype: 'threenames',
        itemId: 'applicant',
        name: 'applicant'
    },
    {
        xtype: 'threenames',
        itemId: 'dependent',
        name: 'dependent'
    }
]

【讨论】:

  • 不,它有同样的问题。把它放在一个表格中,一个输入p, q, r,另一个输入a, b, c,然后获取值返回{"first":["p","a"],"middle":["q","b"],"last":["r","c"]}。所以applicantdependent 除了索引之外没有区别。对表单进行一些更改,数据最终会出现在错误的位置。
  • Ext.ComponentQuery.query('textfield#applicant') 和 Ext.ComponentQuery.query('textfield#dependent') 会将文本字段组合成您想要的不同申请人和依赖结果的结果
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2011-07-21
  • 2012-06-08
  • 2012-12-12
  • 2013-03-23
  • 2013-12-02
相关资源
最近更新 更多