Как мне создать таблицу с фильтром, который фильтрует на сервере в webMethods CAF?

У меня есть веб-сервис, который заполняет таблицу, используя SelectableListTableContentProvider, который работает хорошо.

Однако, если я добавляю элемент управления Filter Input в таблицу, все, что он делает, это фильтрует содержимое текущей таблицы на стороне клиента, т.е. если я нахожусь на странице 1 из 10 таблицы, он не проверяет все значения только на странице 1.

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

1 ответ

Решение

Вот как вы это делаете:

  1. Создайте, как вы говорите SelectableListTableContentProvider (давайте назовем это myDataProvider) и убедитесь, что все эти вещи работают между веб-сервисом, провайдером и экраном. Это на всякий случай, если здесь есть ошибка, и следующий бит не будет работать должным образом. Просто убедитесь, что он выглядит нормально, просматривайте данные должным образом и т. Д. Присвойте таблице хороший описательный идентификатор.

  2. Добавьте элемент управления фильтра ввода на экран. Установите его For свойство быть идентификатором таблицы.

  3. Войдите в свой код и измените myDataProviderтип от SelectableListTableContentProvider в FilterableSelectableListTableContentProvider, Вам нужно будет сделать это в объявлении переменной:

    SelectableListTableContentProvider myDataProvider;
    

    В двух местах его геттер:

    public com.webmethods.caf.faces.data.object.SelectableListTableContentProvider getMyDataProvider()  {
      if (myDataProvider == null) {
        metadataOrganisationProvider = (com.webmethods.caf.faces.data.object.SelectableListTableContentProvider)resolveExpression("#{myDataProvider}");
      }
    
      resolveDataBinding(MYDATAPROVIDER_PROPERTY_BINDINGS, myDataProvider, "myDataProvider", false, false);
      return myDataProvider;
    }
    

    И в конфиге управляемого бина в faces-config.xml:

    <managed-bean>
    <managed-bean-name>myDataProvider</managed-bean-name>
    <managed-bean-class>com.webmethods.caf.faces.data.object.SelectableListTableContentProvider</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <description>Specifies whether the session bean expires when the pageflow is out of scope</description>
        <display-name>Expire With Page Flow</display-name>
        <property-name>expireWithPageFlow</property-name>
        <property-class>java.lang.Boolean</property-class>
        <value>true</value>
    </managed-property>
    

    В каждом примере я показываю, как это выглядит до того, как это изменилось. Просто добавьте слово Filter до SelectableListTableContentProvider,

    Теперь у вас есть поставщик фильтруемого контента.

  4. В этот момент на экране появится сообщение об ошибке, если вы попытаетесь запустить его. Зачем? Хороший вопрос. Почему, Software AG? Почему вы не предоставляете разумный дефолт? Почему мы должны выбрать, какое поле фильтровать, в отличие от стандартного поведения клиентского элемента управления Input Filter, который по умолчанию фильтрует все?

    Тем не мение. Откройте фильтруемый провайдер на панели "Привязки". Это выглядит немного странно, потому что я не думаю, что они настроили это так хорошо, как могли бы. Выберите Row Filter Value Binding свойство (его значок - * в поле; не знаю, почему это не строка) и задайте для его свойства привязки данных значение переменной области управления соответствующего поля в поставщике.

    Это не имеет смысла? Хорошо, я сломаю это:

    1. Нажмите на свой стол в окне просмотра WYSIWYG. Не строка в таблице, а вся таблица. Удостоверьтесь, что это остается выбранным, и вы случайно не отмените выбор.
    2. Нажми на Row Filter Value Binding под вашим провайдером в области привязок.
    3. На панели "Свойства" перейдите на вкладку "Привязка данных" и щелкните #{...} Кнопка для поиска нужного значения.
    4. В открывшемся всплывающем окне перейдите к началу и откройте Controls Scoped Variables раздел. Если этого не существует, вернитесь к пункту а) и сделайте это правильно:)
    5. Выберите значение, по которому вы хотите фильтровать.
    6. Хит в порядке. Поле будет связано с чем-то, что выглядит следующим образом:

      #{result.nameOfFieldToFilterOn}
      

Разверните и наслаждайтесь:)

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