Nano Hash - криптовалюты, майнинг, программирование

ExtJS - Как я могу откатить выбор к старой выбранной записи в сетке?

Он использует сетку ExtJS. Я хотел бы сделать некоторую проверку перед изменением записи в сетке на другую запись.

Ниже мой пример кода:

xtype: 'grid',
bind: {
    store:'{xxStore}'
},
columns: [
    {
        text: 'Name',
        dataIndex: 'name',
    }
],
listeners:{
    beforeselect: 'onBeforeSelect',
    select: 'onSelect'
}

В контроллере пример кода выглядит следующим образом:

onBeforeSelect: function(grid) {
    // whether can select or not
    if (this.getSettingType() === 'global') {
        return false;
    }
},

onSelect: async function(grid, itemRecord) {
    if (!(await checkUserAction())) {
        // TODO: how to rollback to old selected record here or onBeforeSelect?
    }
},

checkUserAction: function() {
    return new Promise((resolve) => {
        let me = this;

        Ext.Msg.show({
            buttons: Ext.Msg.YESNO,
            title: 'Confirm Discard Changes',
            msg: 'Do you want to discard changes?',
            callback: function(button) {
                if (button == 'yes') {
                    resolve(true);
                } else {
                    resolve(false);
                }
            }
        });
    });
}

Как это выполнить?


Дополнить поток выбора:

введите здесь описание изображения


Ответы:


1

По образцу (записям) делаешь брак. В магазине вы выполняете rejectChanges, это вызовет отклонение для каждой записи.

РЕДАКТИРОВАТЬ: - каждая запись (экземпляр Ext.data.Model или потомок) является либо новой записью (фантом = истина), либо существующей записью, либо существующей записью, которая была изменена (грязная = истина), либо существующей записью, которая была стерта. (стерто = верно). Любая существующая запись может иметь поля, которые были изменены с момента ее первоначальной загрузки или последней фиксации.

Когда запись вставляется в хранилище, если для idPropery установлено значение, она считается существующей записью, если нет, то это новая запись (фантом = истина), которая еще не была зафиксирована и, следовательно, является фантомом. То же самое с записью о том, что вы выполняете метод erase(). Его нужно удалить. Запись все еще находится в хранилище, просто для нее установлено значение eraser=true. Когда вы выполняете метод sync() в хранилище, фантомные записи сохраняются в базе данных, измененные записи имеют сохраненные изменения, а стертые записи удаляются из базы данных. То, как выполняются все эти изменения, основано на прокси модели.... после того, как синхронизация вызывается, фантомные записи больше не фантомы, а существующие записи. стертые записи удаляются из хранилища, а измененные записи больше не считаются грязными или измененными.

Если вы сделаете rejectChanges в хранилище до sync(), то хранилище вернется к тому состоянию, в котором оно было после последней sync() или load(). Фантомные записи будут удалены, стертые записи перестанут быть стертыми, а измененные записи вернут все изменения в то состояние, в котором они были до изменения.

Итак, в вашем случае установите idProperty (в модели) на первичный ключ записи и убедитесь, что он имеет значение при вставке записей в хранилище. Затем, когда вы сделаете rejectChanges в магазине, он вернется к тому, как это было до изменений. Вы можете запустить commitChanges() в хранилище, что сделает все записи немодифицированными, а не фантомными и не стертыми.

К вашему сведению: если вы не передадите свойство id, сенча назначит уникальный ключ записи, но все равно сделает ее фантомом (фантом = истина)

16.10.2020
  • Привет @ mcg1103, проверил, что grid.getSelectionModel() не имеет функции отклонения. Таким образом, когда я вызвал grid.getStore().rejectChanges(), все записи в сетке исчезли. Можете ли вы поделиться кодировкой для справки? Благодарю. 21.10.2020
  • Я предполагаю, что каждая запись (Ext.data.Model) была установлена ​​с phantom = true. Это означает, что это новая запись (еще не сохраненная в базе данных/удаленном), поэтому, когда вы отклоняете ее в хранилище, она удаляет эти записи, поскольку считает, что они были добавлены, а не сохранены. Вы должны установить idProperty в модели, и когда вы вставляете записи, он должен иметь значение. Когда вы загружаете записи из базы данных, у них есть первичный ключ, поэтому idProperty будет иметь значение. 21.10.2020
  • @DaiKeung - я отредактировал свой ответ, чтобы прояснить некоторые моменты, касающиеся магазина. 21.10.2020
  • Привет @ mcg1103, большое спасибо за подробное объяснение. Я добавил idProperties, чтобы попробовать, но все еще не в порядке. Я даже пытался совершать изменения после вставленных данных для сохранения. Я дополнил ожидаемый поток для справки. Пожалуйста, посоветуйте, спасибо. 22.10.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..