commandButton неактивен после рендеринга ajax

У меня проблема с этими двумя commandButton : Join и Leave.

Я хочу скрыть «Присоединиться», если я нажму «Выйти», и наоборот.

Когда я ставлю ajax на false, проблем нет (но вся страница обновляется, и я не считаю это оптимальным).

Но когда атрибут ajax имеет значение true с определенным обновлением (см. комментарий в коде), рендеринг хороший, но новая кнопка, которая появляется, становится неактивной. Если я нажму на него, ничего не произойдет (ну, похоже, это триггер actionListener, но представление не обновляется, мне нужно обновить вручную, чтобы увидеть разницу)

Спасибо за прочтение.

<h:form id="formWaitingList" rendered="#{connexion.connected}" >
    <p:commandButton id="Join"  
                    actionListener = "#{connexion.joinWaitingList()}"
                    rendered="#{!connexion.waiting}"
                    ajax="false"
               <!-- ajax="true"
                    update="Join,Leave"-->
                    value="Join"/>

   <p:commandButton id="Leave" 
                    value="Leave"
                    ajax="false"
               <!-- ajax="true"
                    udpate="Join,Leave"-->
                    rendered="#{connexion.waiting}"
                    actionListener ="#{connexion.leaveWaitingList()}" />
</h:form>

person Nicolas Unknoown    schedule 06.07.2013    source источник
comment
Вы должны использовать update=@form для этого случая, потому что buttons с rendered=false не появляется в сгенерированном html-коде, поэтому вы не можете обновить их напрямую.   -  person danRod    schedule 07.07.2013


Ответы (1)


Похоже, вы не совсем знакомы с HTML/JavaScript. Вы знаете, что JSF — это, по сути, генератор кода HTML/JavaScript(/CSS). Обновление Ajax в JavaScript работает примерно так:

  • После отправки запроса ajax в JSF через XMLHttpRequest получите ответ XML, который содержит все элементы, которые необходимо обновить, вместе с их идентификаторами клиентов.
  • Для каждого обновляемого элемента используйте document.getElementById(clientId), чтобы найти его в текущем дереве HTML DOM.
  • Замените этот элемент новым элементом, как указано в ответе ajax XML.

Однако, если компонент JSF не сгенерировал свое HTML-представление из-за rendered="false", то в дереве HTML DOM нет ничего, что можно было бы найти и заменить. Это полностью объясняет симптомы, которые вы «наблюдаете».

По сути, вам нужно обернуть условно обработанные компоненты JSF в компонент, HTML-представление которого всегда отображается, а затем ссылаться на него вместо этого в обновлении ajax.

Например,

<h:form>
    ...

    <h:panelGroup id="buttons">
         <p:commandButton ... update="buttons" rendered="#{condition}" />
         <p:commandButton ... update="buttons" rendered="#{not condition}" />
    </h:panelGroup>
</h:form>

Смотрите также:

person BalusC    schedule 07.07.2013
comment
Оооо отлично работает! Я видел один из ваших постов об обертывании панелью, но вместо того, чтобы обернуть только кнопки, я обернул и форму ›‹. Спасибо вам ! - person Nicolas Unknoown; 07.07.2013
comment
@BalusC Привет, BalusC, у меня есть вопрос по этому поводу, если вы не возражаете. Я только что играл с кодом OP (тоже новичок в ajax), и я сделал это <p:commandButton id="Join" rendered = "conditionforButton1" actionListener = "#{connexion.joinWaitingList()}" value="Join"/> (кнопка № 2 имеет отдельное значение rendered). В прослушивателе действий для кнопки № 1 я установил для атрибута rendered второй кнопки значение true, а для первого — значение false. Вторая кнопка действительно появилась, но actionListener никогда не срабатывала, когда я нажимал. Почему это ? - person Andy; 08.07.2013
comment
@BalusC Думаю, я не вижу полной картины. Из вашего ответа я понимаю, что если rendered является ложным, для кнопки № 2 не создается HTML, поэтому он никогда не будет обновляться, потому что... ну, во-первых, его там нет, но в моем случае кнопка № 2 действительно появилась. .. Я остановлюсь здесь. Если мой ответ расплывчатый / запутанный, сообщите мне, и я опубликую официальный вопрос. Спасибо. - person Andy; 08.07.2013
comment
@Andy: условие должно быть ограничено просмотром. См. также пункт 5 stackoverflow .com/questions/2118656/ - person BalusC; 08.07.2013
comment
@BalusC Это область просмотра :(. Позвольте мне еще раз перечитать эти два ответа. - person Andy; 08.07.2013
comment
@BalusC Я так запутался. Я исследовал все утро. Я продолжу и опубликую актуальный вопрос, если не смогу понять это сегодня вечером. Большое спасибо. - person Andy; 08.07.2013