2010-09-13 3 views
2

У меня есть кнопка onclick, она должна перейти на другую страницу, содержащую jqGrid..but, если пользователь хочет пойти и посмотреть данные, которые он должен кэшировать и показать вместо того, чтобы позвонить на сервер. .. значения формы были кешем по умолчанию, но jqGrid ... как его кешировать?jqGrid кэширование данных сетки

ответ

1

Кэширование данных может быть реализовано, но это непросто. Вы должны определить на стороне сервера некоторые заголовки HTTP, основанные на выбранном caching strategy. Например, вы можете использовать max-age заголовка HTTP «Cache-Control», как

Cache-Control: max-age=60 

, что означает, что ответ сервера должен быть в кэше в течение 60 секунд на клиенте. Если вы планируете использовать это, вы должны определить дополнительный параметр prmNames:{nd:null} jqGrid, который удалит отправку параметра nd с отметкой времени, включенной в любой запрос сервера. После выполнения этих шагов все запросы ajax, используемые jqGrid, будут получены из локального кеша в течение временного интервала (60 секунд).

Реализация кеширования на стороне сервера со стратегией, более сложной с фиксированным временем кеширования, возможна в отношении ETags (теги сущностей). Это моя любимая стратегия, но ее реализация относительно сложна (см. Guidance on a better way to retain filtering options when using ASP.NET MVC 2 и Concurrency handling of Sql transactrion).

Если путь с кэшированием данных вы будете не в состоянии использовать (какие-либо причины) я бы рекомендовал вам в качестве альтернативы следующих два вариантов:

  1. создание сетки на ту же странице как кнопки и другие фильтры из формы, определяющей параметры jqGrid (см. How to filter the jqGrid data NOT using the built in search/filter box).
  2. «Перекрашивание» страницы с формой в отношении jQuery.Remove() или jQuery.Empty() и новой ajax. Например, с jQuery("body").Empty() или jQuery("div#main").Empty(), где <div id="main"> находится где-то на верхней части корпуса. Затем вы можете заполнить тело страницы (или div с id = «main») вызовом типа jQuery("body").load("newPage.htm") или jQuery("div#main").load("newPage.jsp").

Преимущество этих вариантов является то, что вы будете пребывание на той же странице и все данные JavaScript могут быть использованы. Например, вы можете получить старые данные jqGrid из параметра «data», если ваша сетка использует параметр «loadonce: true», а затем создайте новый jqGrid, используя значение данных в качестве параметра «данных» нового jqGrid.

+0

Я не уверен, что OP использует JSON или нет, но если он есть, есть способ кэшировать исходные данные JSON.Мог ли он передать эти кэшированные данные на эту новую страницу, которая затем заполнит сетку? Мне просто интересно, что вы думаете о чем-то подобном? Я не знаю, возможно ли это ... – webdad3

+0

@Jeff V: Я отвечаю на многие вопросы ** paul ** и знаю, что он использует JSON, но все, что я написал, будет истинным для любых запросов ajax ('datatype : "xml" 'например). Если первый ответ с сервера содержит 'Cache-Control: max-age = 60' в заголовке HTTP, то все запросы из одного браузера и ** с любой другой страницы ** будут получать из локального кеша, не отправляя никаких запрос на сервер. Вы должны использовать 'prmNames: {nd: null}', как я писал. Так вот работа. Я потратил много дней на реализацию кэширования «ETag» и протестировал его в разных браузерах. Все делают то же самое. Так кэширование будет работать – Oleg

+0

ваша реализация выглядит сложной, но я попытаюсь реализовать ... просто интересно, есть ли какая-либо проблема с производительностью, если я буду кэшировать как 5000-6000 записей? .. Да, я использую loadonce: true для локальной сортировки, фильтрации – paul

1

Формы являются частью спецификации HTML, jqGrid не ... почему вы ожидаете кэширования данных сетки?

При этом, если вы используете GET url для извлечения данных для сетки, некоторые браузеры, такие как IE, будут кэшировать результаты GET. Вам нужно будет сделать URL уникальным (например, добавив временную метку), чтобы предотвратить кэширование данных. Однако имейте в виду, что это не будет кэшировать данные во всех браузерах.

+0

ну, это мое требование для страницы ... скажем, у меня есть страница инвентаризации и страница истории транзакций. Теперь, когда пользователь хочет посмотреть, какие данные есть в инвентаре, он просто нажимает кнопку и видит это. ..i не хотят делать слишком много серверных вызовов, так как их дорогая, а не такая, если последняя просматриваемая страница может быть кэширована, чем разрешит проблему ... Я не уверен, возможно ли это с помощью jqGrid ... спасибо! хотя – paul

Смежные вопросы