У меня странная ситуация, когда использование @parent или даже явных идентификаторов не работает в атрибуте update. Но @form отлично работает.
Я сделал очень простой тестовый пример, который включает в себя простую сетку, поведение которой выглядит следующим образом:
- Каждая запись в сетке имеет кнопку изменения
- После нажатия кнопки «Изменить» он изменит данные сервера, и кнопка исчезнет, поскольку она будет отображаться только в том случае, если запись НЕ была изменена.
Кнопка изменения выглядит следующим образом:
<!-- this works, since it's using @form in the update attribute -->
<p:column>
<p:commandLink
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update="@form"
rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>
Обратите внимание, что атрибут update использует @form, который заставляет его работать: при нажатии кнопки изменения он обновляется и исчезает.
Замените его @this или @parent или идентификатором сетки, тогда он НЕ будет работать. Для меня очень логично использовать идентификатор сетки в атрибуте update, так как я хотел бы обновить сетку после нажатия на кнопку.
Я пытался использовать rowIndexVar="rowIndex"
и myGridId:#{rowIndex}:link
, но все еще не работает.
<!-- this does not work -->
<p:column>
<p:commandLink id="link"
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update="tblUser"
rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>
Вот ресурсы для этого простого примера:
- Файл xhtml
- Файл JSF Bean
- Пользователь POJO bean
Я использую Tomcat 7, и это мои зависимости:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
Попробовал также Primefaces 3.0.M1, но он также получил такое же поведение.
Пожалуйста, поделитесь своими идеями. Это ошибка или я что-то не так сделал?
UPDATE
Здравствуйте,
Я только что закончил некоторые испытания, но все по-прежнему не удается.
Тест 1 (с использованием update=":gridRPBDetails"
):
Файл JSF:
<p:commandLink id="undoLink" value="Undo" process="@this"
action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
update=":gridRPBDetails"
rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
title="Batalkan buang data" />
Сгенерированный xhtml:
<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails'});"
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>
Тест 2 (с использованием update=":gridRPBDetails:#{rowIndex}:undoLink"
):
Файл JSF:
<p:commandLink id="undoLink" value="Undo" process="@this"
action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
update=":gridRPBDetails:#{rowIndex}:undoLink"
rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
title="Batalkan buang data" />
Сгенерированный xhtml:
<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails:0:undoLink'});"
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>
Оба теста по-прежнему терпят неудачу, поскольку нажатие кнопки отмены не может обновить запись сетки или даже самой сетки.
UPDATE
Я только что обновил свой тест, используя:
<p:commandLink
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update=":mainForm:tblUser"
rendered="#{not testUserBean.isRecordModified(user)}" />
Обратите внимание, что я использовал :mainForm:tblUser
, и я попробовал другие варианты и все еще не смог:
- : MainForm: tblUser:
- : tblUser (когда я не определяю имя формы)
- : MainForm: tblUser: # {RowIndex}: LinkId
Но я замечаю одну вещь: независимо от того, что я выбрал для обновления, обновление всегда заканчивается как tblUser: 0
<a onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/test.xhtml',
{formId:'mainForm',async:false,global:true,source:'tblUser:0:j_idt33',
process:'tblUser:0:j_idt33',
update:'tblUser:0'
});" href="javascript:void(0);" id="tblUser:0:j_idt33">modify record</a>
Я пытался изменить tblUser: 0 на лету, используя firebug, чтобы просто tblUser , частичный рендеринг на сетке работает нормально.
Я начинаю думать, что это ошибка при попытке обновить сетку из записи сетки.