Обновление сетки 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, есть заметные скачки вперед и назад.