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

Фильтр не принимает значение из поля только для чтения во время фильтрации

Я использую JSF 2.2, Primefaces 6.0 и CDI. У меня есть datatable, в котором реализована ленивая загрузка (datatable загружает данные из базы данных). Каждый столбец имеет поле фильтра.

Один из столбцов должен иметь поле фильтра readonly (я сохраняю значение для этого фильтра в некоторой переменной перед отображением datatable). Итак, как я уже писал, это поле фильтра должно быть readonly (не редактируемое) и фильтр должен брать значение из этого поля в фильтрацию. Как реализовать эту функцию?

Я попытался добавить компонент inputtext и установить атрибут readonly:

<p:dataTable id="dataTableOfDataStore" var="obj" widgetVar="dataTableOfDataStoreVar" 
            value="#{formVisualizationController.dataTableLazy}"             
            lazy="true"
            filteredValue="#{formVisualizationController.filteredDataTable}" 
            filterDelay="2000"

            <!-- other attributes -->                       
            >

    <!-- other columns -->

    <p:column headerText="Source IP" sortBy="#{obj.sip}"
            filterBy="#{obj.sip}" filterMatchMode="contains">
        <f:facet name="filter">
            <p:inputText readonly="true" onchange="PF('dataTableOfDataStoreVar').filter()"
             value="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}"
            style="width: 100%; background-color: #0088cc; color: #ffffff;"/>
        </f:facet>          
        <h:outputText value="#{obj.sip}" />     
    </p:column> 

    <!-- other columns -->

</p:dataTable>

К сожалению, это не работает. Когда я удаляю атрибут readonly, он работает, но тогда поле фильтра также можно редактировать.

Конечно, я могу добиться этого, вручную передав это значение в запрос к базе данных, а затем удалив фильтр из столбца и сохранив компонент inputtext со значением (и с атрибутом readonly), но, возможно, вы знаете какой-то другой способ добиться этого. .


Ответы:


1

Этот ответ объясняет, почему поля только для чтения не включаются в запрос. Поэтому Primefaces не использует его для фильтрации.

На мой взгляд, вам все равно придется переопределить/проверить его на стороне сервера, если вы хотите убедиться, что он не был подделан. Поэтому установка его программно кажется лучшим решением.

Вы можете сделать это либо в своем запросе, либо программно добавив значение фильтра. Например, вы можете переопределить метод загрузки, чтобы использовать значение из вашего bean-компонента, если это обязательно.

dataTableLazy = new LazyDataModel<?>(){
    public List<Site> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
        //set your filter here
        super.load(first, pageSize, sortField, sortorder, filters);
    }
}
12.07.2016
  • Спасибо за ваш отзыв. Я изменил свой метод load и поместил свое значение (для столбца Source IP) в параметр filters метода load. Кажется, это лучшая идея. Спасибо! Я также добавил ответ, который включает шаги, которые я сделал. 12.07.2016

  • 2

    Реализация выбранного ответа

    1. Модификация представления JSF. Я сохранил компонент inputtext (с атрибутом readonly), который включает мое постоянное значение, и удалил функцию фильтрации (на стороне клиента) для этого столбца. Атрибуты фильтра должны оставаться в компоненте <p:column>, иначе вы не увидите компонент inputtext в строке заголовка столбца.

      <p:column headerText="Source IP" sortBy="#{obj.sip}"
              filterBy="#{obj.sip}" filterMatchMode="contains">
          <f:facet name="filter">
              <p:inputText readonly="true" value="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}"
              style="width: 100%; background-color: #0088cc; color: #ffffff;"/>
          </f:facet>          
          <h:outputText value="#{obj.sip}" />     
      </p:column>
      
    2. В методе load я поместил свое значение в параметр filters, в котором хранятся все необходимые значения для фильтрации.

      dataTableLazy=new LazyDataModel<Data>() {
      
          @Override
          public List<Data> load(int first, int pageSize, List<SortMeta> multiSortMeta,
                  Map<String, Object> filters) {  
      
              //here I put my value
              filters.put("sip", selectedSourceIP.getIp());
      
              List<Data> result=dataService.getLazyDataStoreTable(idSeletedUserTable, first, pageSize, multiSortMeta, filters);
      
              //other code
      
              return result;
          }
      };
      
    12.07.2016

    3

    Моя идея состоит в том, чтобы использовать кнопку выбора одной для имитации поля фильтра только для чтения, как показано ниже:

        <p:column headerText="Source IP" sortBy="#{obj.sip}"
                  filterBy="#{obj.sip}" filterMatchMode="contains">
            <f:facet name="filter">
                <p:selectOneButton onchange="PF('dataTableOfDataStoreVar').filter()">
                    <f:selectItem itemLabel="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}" 
                                  itemValue="#{formVisualizationController.selectedSourceIPFieldOfFiltr.ip}" />
                </p:selectOneButton>
            </f:facet>          
            <h:outputText value="#{obj.sip}" />     
        </p:column> 
    
    12.07.2016
  • Проверяет ли Primefaces/JSF автоматически, что значение, возвращаемое в HTTP-запросе, действительно является допустимым элементом списка? А если нет, то что происходит? 12.07.2016
  • Спасибо за ваш отзыв. Ваше решение работает, но не так, как я ожидаю. В вашем решении фильтр не работает автоматически, поэтому сначала я должен активировать кнопку, нажав на нее. Я исключил вариант, который работает следующим образом: когда отображается datatable, фильтр должен работать автоматически, потому что он получил значение в поле фильтра. Но спасибо за вашу идею. 12.07.2016
  • Новые материалы

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

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

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

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

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

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

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