Nano Hash - криптовалюты, майнинг, программирование

Как сохранить параметры для действия, чтобы использовать их позже

У меня есть представление списка, которое можно сортировать, искать и фильтровать. Из этого списка пользователь может редактировать элементы в несколько этапов. Наконец, после редактирования и просмотра изменений пользователь возвращается к списку. Теперь я хочу, чтобы список использовал ту же сортировку, условия поиска и фильтры, которые пользователь установил ранее, и показывал правильные результаты.

Как можно сохранить и повторно использовать несколько параметров (сортировка, поиск, фильтр) при отображении действия списка?

Возможные неудовлетворительные способы, о которых я думал:

  • пройти через все необходимые параметры. Работает с трудом, если между двумя вызовами действий списка задействовано несколько действий.
  • сохранить параметры в объекте сеанса. Похоже, что для обработки нескольких параметров требуется много кода (проверьте, был ли параметр передан в действие, сохраните новое значение, если параметр не был передан, получите старый параметр из сеанса, обработайте параметры пустой строки):

    Long longParameter
    if(params.containsKey('longParameter')) {
        longParameter = params.getLong('longParameter')
        session.setAttribute('longParameter', longParameter)
    } else {
        longParameter = session.getAttribute('longParameter') as Long
        params['longParameter'] = longParameter
    }
    

Ответы:


1

Если вы хотите сделать его более общим, вы можете использовать вместо него Interceptor.

Возможно, это можно было бы обобщить следующим образом:

class SessionParamInterceptor {
    SessionParamInterceptor() {
        matchAll() // You could match only controllers that are relevant.
    }

    static final List<String> sessionParams = ['myParam','otherParam','coolParam']

    boolean before() {
        sessionParams.each {
            // If the request contains param, then set it in session
            if (params.containsKey(it)) {
                session[it] = params[it]
            } else {
                // Else, get the value from session (it will be null, if not present)
                params[it] = session[it]
            }
        }

        true
    }
}

Статический sessionParams содержит параметры, которые вы хотите сохранить/получить из сеанса.

Если params содержит элемент из списка, он сохраняется в session под тем же именем. Если нет, то он берется из session (учитывая, что он существует).

В вашем контроллере теперь вы можете просто получить доступ к params.getLong('theParam'), как всегда. Вы также можете использовать преобразование параметров Grails:

def myAction(Long theParam) {

}

Сохранено много LOC.

20.10.2016
  • Я запустил код, и он, кажется, работает, но у меня нет тестов, чтобы доказать это :-) 20.10.2016
  • Если вы используете Grails ‹ 3, ту же концепцию можно использовать в фильтре Grails. 20.10.2016

  • 2

    Я тоже использую сессию. Вот образец, который вы можете адаптировать к своим потребностям:

    def list() {
      if (request.method == 'GET' && !request.queryString) {
        if (session[controllerName]) {
          // Recall params from memory
          params.putAll(session[controllerName])
        }
      } else {
        // Save params to memory and redirect to get clean URL
        session[controllerName] = extractParams(params)
        redirect(action: actionName)
        return
      }
    
      // Do your actions here...
    }
    
    def extractParams(params) {
      def ret = [:]
      params.each { entry ->
        if (entry.key.startsWith("filter_") || entry.key == "max" || entry.key == "offset" || entry.key == "sort" || entry.key == "order") {
          ret[entry.key] = entry.value
        }
      }
      return ret
    }
    
    20.10.2016

    3

    Лучше всего использовать session. Просто сохраните предпочтение, когда предпочитаете. Я имею в виду, когда пользователь сортирует или фильтрует, просто сохраните эту информацию в session для этого конкретного <controller>.<action>, прежде чем возвращать страницу. В следующий раз проверьте session, если есть что-то связанное с этим <controller>.<action>, примените их; в противном случае отображать страницу по умолчанию.

    Возможно, вы захотите использовать для этого Interceptor, как предлагает sbglasius, здесь.

    Надеюсь, вы поняли мою точку зрения.

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..