Проблема с реализацией прокси-сервера sessionStorage в представлении Ext JS Grid

Я только что создал скрипку Sencha, в которой у меня есть одна панель с двумя видами сетки внутри. Оба вида сетки облегчают выбор элементов слева направо и наоборот. Я пытаюсь отобразить выбранный элемент из левой сетки в правой сетке. Я использую прокси-сервер sessionStorage для хранения данных при перемещении элементов слева направо в виде сетки. Мне нужно использовать sessionStorage, потому что мое требование - сохранить этот выбор на страницах.

Ссылка на скрипку Sencha: https://fiddle.sencha.com/#view/editor&fiddle/2j7u

Хотя я не получаю никаких ошибок, но моя реализация не работает. Даже журналы консоли показывают правильные данные выбора. Но все же я не могу заполнить правильный вид сетки.

Я заметил одну вещь: в отладчике браузера в разделе Applcation -> SessionStorage мой объект sessionStorage всегда имеет значение null. Не знаю почему, но на консоли отображаются данные.

Журналы консоли из скрипки

значение sessionStorage из отладчика

Будем очень признательны за любые указатели!

Кстати, та же реализация отлично работала с Ext JS 4.2. Но я столкнулся с проблемой при переходе на Ext JS 6.5

Спасибо, Дхирадж

Дальнейшее устранение неполадок:

Кроме того, я обновил ту же скрипку и успешно заставил ее работать дальше, закомментировав 'suspendEvents' и 'resumeEvents' для моей правой сетки store -> store2 и sessionStore -> sessionStore2 в методе tropos.selectDevices.addToSelect. Наряду с этим я понял, что строка store2.loadPage (1) в методе tropos.selectDevices.updateGridViews очищает мою сетку при загрузке. Я пытался избежать этого, используя для параметра конфигурации clearOnPageLoad значение false. Но это НЕ сработало, поэтому я прокомментировал эту строку, чтобы она работала. Теперь, хотя это работает, но мое основное требование СОХРАНЕНИЯ выбора пользователя все еще не выполнено, потому что sessionStorage все еще не работает.

Обновленная рабочий пример:https://fiddle.sencha.com/#view/editor&fiddle/2j7u

Спасибо, Дхирадж

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
145
1

Ответы 1

Попробуйте этот код в своем addToSelect:

example.selectDevices.addToSelect = function(storeObj){
    var addRecs = [], newRecs = [],
    store2 = Ext.getCmp('grid2').getStore();

    //********************  
    //I just comment all  *sessionStore2* references because is redundand,
    //store2 is the same as sessionStore2 
    //********************

    //sessionStore2 = Ext.data.StoreManager.lookup('currentlySelectedDevices');
    //store2.suspendEvents();
    //sessionStore2.suspendEvents();

    Ext.each(storeObj,function(record){
        var rec = record.copy();
        rec.phantom = true;
        addRecs.push(rec);
        newRecs.push(record.data.hid);
    });
    example.selectDevices.selectedDeviceIds = example.selectDevices.selectedDeviceIds.concat(newRecs);
    store2.add(addRecs);
    //store2.commitChanges();

    for(i=0; i < store2.data.items.length; i++) {
        console.info("addToSelect: Selected Device Serial [" + i + "] from STORE_2: " + store2.data.items[i].data.hid);
    }
    //sessionStore2.add(addRecs);

    //for(j=0; j < sessionStore2.data.items.length; j++) {
    //    console.info("addToSelect: Selected Device Serial [" + j + "] from SESSION_STORAGE_2: " + sessionStore2.data.items[j].data.hid);
    //}
    //sessionStore2.sync();

    store2.sync();
    //sessionStore2.resumeEvents();

    example.selectDevices.updateGridViews();
};

Обновлено: Вы должны пометить запись как phantom = true, чтобы синхронизация работала правильно

@Fabrio: Спасибо за попытку. Как и ожидалось, он работает, но это не то, что я могу использовать, потому что я не могу полностью удалить sessionStorage. Например, если пользователь выполняет выбор устройства и ЗАКРЫВАЕТ панель без действия отправки. Теперь, когда он пытается снова открыть панель (повторным нажатием кнопки «Выбрать устройство»), весь выбор устройства, который он сделал ранее, будет утерян, потому что для загрузки панели я использую прокси-хранилище sessionStorage. См. Вызов функции example.selectDevices.handleSelectedDevices, загружающей панель. По моему требованию мне пришлось СОХРАНИТЬ выбор пользователей.

Dhiraj 14.07.2018 02:17

@Fabrio: Спасибо, Фабрио, мне не хватало фантомной магии! Теперь работает.

Dhiraj 16.07.2018 03:09

Другие вопросы по теме