【问题标题】:How do you create dynamic local store based on record property如何根据记录属性创建动态本地存储
【发布时间】:2020-04-30 01:56:20
【问题描述】:

我在后端有一个整数字段。该字段是一个偏移量(CPI 索引延迟),它可以从 0 -> N 中获取值。在前端我想显示一个带有这个值/标签的组合框:

{key: 0, label: "0 - 21/06/2020"}
{key: 1, label: "1 - 21/06/2021"}
{key: 2, label: "2 - 21/06/2022"}
{key: 3, label: "3 - ...       "}

选项的数量是这样计算的:rent_end_date.year - first_due_date.year。每次first_due_date变化时,组合框的选项都要重新计算一次。

为了实现这一点,我使用相关公式初始化了一个变量 indexOffsetChoices,以在每次 first_due_date 更改时计算选择:

viewModel: {
    type: 'rentsdetailformmodel',
    data: {
        hideRentsDetailGrids: false,
        indexOffsetChoices: []
    },
    formulas: {
        calculateIndexOffsetChoices: {
            bind: '{detailRecord.first_due_date}',
            get: function (firstDueDate) {
                var detailRecord = this.get('detailRecord'),
                    indexOffset = detailRecord.get('index_offset'),
                    rentEndDate = detailRecord.get('end_date');
                if (indexOffset !== undefined && rentEndDate !== undefined) {
                    var choices = [];
                    for (i = 0; i < (rentEndDate.getFullYear() - firstDueDate.getFullYear()); i++) {
                        var RawCPIDate = new Date(firstDueDate.setFullYear(firstDueDate.getFullYear() + i)),
                            CPIDateFmt = Ext.Date.format(new Date(RawCPIDate), 'd/m/Y'),
                            label = i + ' - ' + CPIDateFmt;
                        choices.push({"key": i, "label": label});
                    }
                    this.indexOffsetChoices = choices;
                }
            }
        }
    }
},

然后我添加了我的组合框和一个指向 viewModel 变量 indexOffsetChoices 的内联本地存储:

items: [{
    xtype: 'combobox',
    name: 'index_offset',
    reference: 'index_offset',
    fieldLabel: 'CPI Application Delay',
    valueField: 'key',
    displayField: 'label',
    queryMode: 'local',
    bind: '{detailRecord.index_offset}',
    store: {
        type: 'store',
        storeId: 'rent__index_offset',
        idProperty: 'key',
        fields: ['key', 'label'],
        data: this.indexOffsetChoices
    }
}]

但是数据没有加载。这是正确的做法吗?您如何根据记录/动态数据创建本地商店?我错过了什么?

【问题讨论】:

    标签: extjs store


    【解决方案1】:

    先生,您做得最辛苦! viewModel 中的'data' 属性实际上不用于存储大量数组数据,除非您会努力修改它们。

    在组合框中设置动态选项可以通过更新(或重新设置)它的选项(使用yourcombofield.setOptions([/*new array data*/]),如here)或它的数据存储(使用yourcombofield.getStore().setData([/* new array data*/]),如here)或者如果你声明你的存储在 viewModel 'stores' 属性中,如 here 并已链接到您的组合框的 store 属性,您不需要再次访问组合框,只需修改存储的数组数据和您的组合框的选项已链接到商店将自动更新。重要的是,尝试提供最简单的方法来修改存储中的数组数据。

    现在,让我们谈谈您将在何时何地放置代码来更新此组合框的数据?这是关于您要收听的事件所有者(并且也会影响您的案例)。您说“每次first_due_date 更改”。如果first_due_date 受到另一个字段的影响,只需将您的代码放在它的change/keyup/keydown 侦听器中,然后通过过滤、删除、添加等重新处理您的数据,最后,用新数据更新旧数据。数据之前已经存储过。

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      • 2012-06-07
      相关资源
      最近更新 更多