Проблема с реализацией прокси-сервера 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

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


person Dhiraj    schedule 13.07.2018    source источник


Ответы (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.log("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.log("addToSelect: Selected Device Serial [" + j + "] from SESSION_STORAGE_2: " + sessionStore2.data.items[j].data.hid);
    //}
    //sessionStore2.sync();

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

    example.selectDevices.updateGridViews();
};

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

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