Команда PrimefacesLink обновляет данные только после двойного щелчка по ней.

Следующий код относится к таблице, в которую я могу добавить (commandButton) или удалить (commandLink) строки. Обе кнопки работают и вызывают соответствующие методы компонента. Но в то время как каждый щелчок по кнопке добавления будет обновлять таблицу, мгновенно добавляя одну строку, для кнопки удаления мне нужно дважды щелкнуть по ней, чтобы удалить строку. Несмотря на то, что строка не удаляется в первый раз, вызывается метод компонента. Что я должен делать? Спасибо!

    <h:form id="form">
        <table>
            <tr>
                <td>
                    <h:panelGrid columns="2" width="100%">
                        <p:dataTable id="univertitiesTable" value="#{universityBean.universityList}" var="university"
                            editable="true" editMode="cell" style="align:center;" >

                            <p:column headerText="Name" style="width:80px" >
                                <p:inputText value="#{university.name}" style="width:25px;" id="nameField"  label="name"  />
                            </p:column>

                            <p:column headerText="" style="width:20px; ">
                                <p:commandLink actionListener="#{universityBean.deleteUniversity}" update="univertitiesTable" id="removeButton" ajax="true">
                                    <h:graphicImage value="/resources/icones/delete.gif" />
                                    <f:setPropertyActionListener value="#{university}"
                                        target="#{universityBean.university}" />
                                </p:commandLink> 
                            </p:column>
                        </p:dataTable>

                        <p:commandButton value="+" update="univertitiesTable" id="addButton" ajax="true"
                            actionListener="#{universityBean.addUniversity}"
                            styleClass="ui-priority-primary"  />

                    </h:panelGrid>                  
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <h:commandButton id="save" value="Save"
                        action="#{universityBean.save}" binding="#{save}" />
                </td>
            </tr>
        </table>    
    </h:form>

person qxlab    schedule 15.11.2013    source источник
comment
Попробуйте удалить ajax=true из commandButton и добавить process=@this к commandButton   -  person SRy    schedule 16.11.2013


Ответы (1)


Вы должны использовать action вместо actionListener. Обновление выполняется после выполнения действия, поэтому, если вы не укажете какое-либо действие, обновление будет выполнено немедленно. Таким образом, представление распознает, что строка удалена, когда вы делаете другое обновление; что делается, когда вы снова нажимаете на ссылку.
Кстати, ajax="true" в любом случае является значением по умолчанию для атрибута ajax.
То есть:

<p:commandLink action="#{universityBean.deleteUniversity}" update="univertitiesTable" id="removeButton">
  <h:graphicImage value="/resources/icones/delete.gif" />
  <f:setPropertyActionListener value="#{university}"
    target="#{universityBean.university}" />
</p:commandLink> 
person user1983983    schedule 16.11.2013
comment
Это правильно большое спасибо. Я мог бы понять это, но кнопка добавления работала правильно с прослушивателем действий, я не понимаю, почему она не ведет себя так же, как кнопка удаления. - person qxlab; 16.11.2013
comment
У меня точно такая же проблема, но я не знаю, почему это решение не помогло в моем случае (jsf 2.2). - person Jalal Sordo; 21.11.2013
comment
Могут быть и другие причины, поэтому проверьте другие вопросы SO, касающиеся этой проблемы, или задайте другой вопрос и предоставьте некоторые подробности. - person user1983983; 21.11.2013