Как вы создаете динамическое c локальное хранилище на основе свойства записи - PullRequest
0 голосов
/ 13 января 2020

У меня целое поле на бэкенде. Это поле является смещением (задержка индекса 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
    }
}]

Но данные не загружаются. Это правильный подход? Как создать локальное хранилище на основе данных records / dynamici c? Чего мне не хватает?

1 Ответ

1 голос
/ 15 января 2020

Вы сделали самый сложный путь, сэр! Свойство 'data' в viewModel на самом деле не используется для хранения больших массивов данных, за исключением того, что вы будете усердно работать над их изменением.

Настройка параметров Dynami c в выпадающем списке может быть достигнута путем обновления (или переустановки ) это параметры (используя yourcombofield.setOptions([/*new array data*/]) например здесь ) или хранилище данных (используя yourcombofield.getStore().setData([/* new array data*/]) например здесь ) или если вы объявите свой магазин в свойстве viewModel 'stores' как here и привязаны к свойству store вашего комбобокса, вам не нужно снова обращаться к комбобоксу, просто измените данные массива магазина, и параметры вашего комбобокса, которые были связаны с магазином, будут обновлены автоматически. Важная вещь, попробуйте дать самый простой способ изменить ваши массивы данных в хранилище.

Теперь давайте поговорим о том, когда и где вы разместите свой код для обновления данных этого комбинированного списка? Речь идет о владельце события, которого вы хотите прослушать (а также влияет на ваше дело). Вы сказали «Каждый раз, когда first_due_date меняется». Если на first_due_date влияет другое поле, просто поместите ваш код в его change/keyup/keydown слушатели, а затем повторно обработайте ваши данные, отфильтровав, удалив, добавив и т. Д. c и последнее, обновив старые данные новыми данными где когда-либо были сохранены данные.

...