2013-08-14 4 views
0

Я пытаюсь получить h: textInput для reerender при изменении, я пробовал его с a4j: ajax и f: ajax.JSF Ajax rerender <h: textInput ...> on Change

При использовании a4j: Ajax:

<h:panelGroup id="xyzPG"> 

<ui:repeat var="var" ... > 
    ... 
    <h:inputText id="#{idController.getIdXYZ(var.id)}" 
    value="#{someModel.value}" 
    size="3" 
    styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}"> 
    <a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" /> 
    </h:inputText> 
    ... 
</ui:repeat> 
</h:panelGroup> 

Это работает в первый раз, после того, как панель обновила первый раз, когда он прекращает обновление Моделла и слушатель не вызывается либо. Однако рендер запускается, вызывая отображение старых значений.

Теперь, когда я заменяю a4j: ajax на f: ajax Я получаю сообщение об ошибке, что идентификатор xyzPG не найден в xyzInput.

<f:ajax event="change" render="@this" listener="#{listener.doSomeStuff}" /> 

При попытке ограничить засавить к inputText всегда обновляет модель и слушатель называется, однако час: inputText не rerendered.

Я уже пробовал поместить другую панель Panel вокруг вводаText, но это тоже не сработало.

Причина, почему мы не используем час: Datatable потому, что мы должны производить таблицу со следующей планировкой:

---------------------------- 
| dataSet1  | dataSet 2 | 
---------------------------- 
| dataSet3  | dataSet 4 | 
etc... 

Поэтому мы используем смещение и шаг атрибуты Ui: повторить.

+0

Пробовали ли вы с другие выравнивания, такие как 'blur',' onkeyup' и т. д.?? – SRy

+0

Ваше динамическое использование 'id' заставляет мои глаза кровоточить. Вы можете избежать всех проблем, связанных с этим, используя что-то подобное в этом ответе: http://stackoverflow.com/a/7312979/785663 Я * думаю * вы страдаете от проблемы с представлением или рендерингом. Нет 'c: repeat' - есть ли у вас' ui: repeat' или 'c: forEach' там? Если последнее, см. Также эту [обязательную ссылку] (http://stackoverflow.com/a/7312979/785663) – mabi

+0

wupps - typ error - поскольку вы справедливо указываете на ее ui: повторите то, что происходит, когда вы выписываете код вместо этого копирования оргинала. Что касается динамического id - я тоже не слишком доволен этим, но из-за специфических ограничений проекта, проект был сделан архитектором проекта, поэтому мы застряли в этом. – dngfng

ответ

1
  1. По дизайну, вы не можете динамически генерировать id атрибуты, используя render- такой как <ui:repeat/>

    Для целей обзора строительства и Ajax-обновления, id ы компонентов должны быть доступны во время просмотра строительства до того оказано вида. <ui:repeat/> уже удовлетворяет уникальности в своих дочерних компонентах. Но если вам требуется контроль над идентификаторами, необходимо использовать обработчик тегов во время компиляции, как <c:forEach/>:

    <c:forEach items="#{idController.itemsList}" var="theVar"> 
        <h:inputText id="#{idController.getIdXYZ(theVar.id)}" value="#{someModel.value}" size="3" styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}"> 
         <a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" /> 
        </h:inputText> 
    <c:forEach/> 
    
  2. Это маловероятно, что вы будете в состоянии достигнуть xyzPG изнутри <ui:repeat/> потому что <ui:repeat/> также контейнер именования, как и <h:panelGrid/> и так далее. Обновление ajax работает с Richfaces, потому что они сделали специальные положения для таких случаев использования. <f:ajax/>, однако, не потерпит этого.xyzPG находится вне сферы действия <ui:repeat/> так, чтобы достичь этого компонента, необходимо использовать уточненное соглашение об именах:

    <f:ajax event="change" render=":form1:xyzPG" listener="#{listener.doSomeStuff}"/> 
    

    Это предполагает, что xyzPG непосредственно содержится внутри <h:form id="form1"/>

+0

Спасибо за подробный ответ. Мне удалось решить проблему, просто используя rich: datagrid. – dngfng

-1

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

<h:inputText id="#{idController.idXYZ}" 

вместо

<h:inputText id="#{idController.getIdXYZ()}" 
+0

Идентификатор разрешен правильно - при использовании эль-нотации с() или (param) вам нужно написать полный метод, включая get. – dngfng

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