Обновление сетки Dojo и положение прокрутки

У меня есть сетка в додзе,

var myGrid = new (declare([Grid, DijitRegistry]))({
    store: myStore, // this is a Observable(Memory())
    columns:[
        {field: "field1", label: "A", sortable: false},
        {field: "field2", label: "B", sortable: false},
        {field: "field3", label: "C", sortable: false},
        {field: "field4", label: "D", sortable: false},
        {field: "field5", label: "E", sortable: false}
    ],
    selectionMode: "single",
    cellNavigation: true,
    queryOptions: {
        sort:[{attribute: "field1", descending: true}]
    }
},
    myDomRef
);

Иногда мне нужно обновить сетку

myGrid.refresh();

Эта сетка имеет полосу прокрутки справа, и я хотел бы сохранить положение полосы прокрутки. Но когда я делаю обновление, оно прокручивается обратно наверх.

Как я могу сохранить положение прокрутки?

2 ответа

Решение

Если вы используете OnDemandGrid, он поддерживает keepScrollPosition свойство, которое вы можете определить в экземпляре сетки, чтобы повлиять на все refresh звонки, или передать конкретно при звонке refresh (например grid.refresh({ keepScrollPosition: true })).

Попробуйте схватить <div> Объект, содержащий сетку и получающий текущую позицию прокрутки:

var elmnt = document.getElementById("myDIV");
var x = elmnt.scrollLeft;
var y = elmnt.scrollTop;

Сохраните позицию, а затем обновите сетку. После завершения обновления восстановите позиции прокрутки:

var elmnt = document.getElementById("myDIV");
elmnt.scrollLeft = x;
elmnt.scrollTop = y;

Я думаю, что значения прокрутки будут на <div> объект в этом случае. Если нет, используйте inspect element в веб-браузере, удерживая указатель мыши над полосой прокрутки, которую вы хотите. Это должно позволить вам найти элемент, для которого требуется сохранить и восстановить его свиток.

Если все страницы обновляются в среде типа CGI, вы можете передать эти значения в качестве URL-пар, чтобы выполнить то же самое.

Как уже упоминалось выше, keepScrollPosition это решение, если вы используете OnDemandGrid.

Если вы используете dgrid/Grid, keepScrollPosition не поддерживается.

Вот как я решил проблему с прыгающими полосами прокрутки (это касается как горизонтальных, так и вертикальных полос прокрутки):Grid имеет метод getScrollPosition(). Вызывая этот метод прямо передrefresh(), вы можете сохранить положение обеих полос прокрутки и вернуться к ним после завершения обновления. Код должен выглядеть примерно так:

var scrollpos = myGrid.getScrollPosition();
myGrid.refresh();
myGrid.scrollTo(scrollpos);


Одно ограничение в этом решении - старые браузеры IE, есть заметные скачки вперед и назад.

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