Использование a p:remoteCommand для обновления a p:dataTable
Учитывая следующий код XHTML, который имеет один <p:inputText>
и <p:dataTable>
имея только две колонки.
<p:remoteCommand name="updateTable" update="dataTable"/>
<p:panel id="panel">
<p:inputText id="txtValue" value="#{testManagedBean.txtValue}"
required="true"/>
<p:message for="txtValue" showSummary="false"/>
<p:commandButton actionListener="#{testManagedBean.submitAction}"
oncomplete="if(!args.validationFailed) {updateTable();}"
update="panel" value="Submit"/>
</p:panel>
<p:panel id="dataTablePanel" header="Data">
<p:dataTable id="dataTable" var="row" value="#{testManagedBean}"
lazy="true"
pageLinks="10"
editable="true"
rowsPerPageTemplate="5,10,15"
rows="10"
rowKey="#{row.catId}"
editMode="row">
<p:ajax event="rowEdit" update=":form:panel dataTable"
listener="#{testManagedBean.onRowEdit}"/>
<p:column id="id" headerText="Id">
<h:outputText value="#{row.catId}"/>
</p:column>
<p:column id="catName" headerText="Category">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{row.catName}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{row.catName}" label="Category">
<f:validateLength minimum="2" maximum="45"/>
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" width="100">
<p:rowEditor/>
</p:column>
</p:dataTable>
</p:panel>
Когда дано <p:commandButton>
нажата, связанный слушатель submitAction()
вызывается и, наконец, <p:dataTable>
обновляется <p:remoteCommand>
только если проверки пройдены успешно.
После этого, если ряд удерживается данным <p:dataTable>
обновляется (что, в свою очередь, обновляет <p:panel id="panel">
с помощью <p:ajax>
внутри <p:dataTable>
, Иногда необходимо), данный <p:inputText>
в <p:panel id="panel">
вызывает проверку, ее границы становятся красными, подразумевая нарушение соответствующей проверки, которая не должна происходить.
Если <p:remoteCommand>
удаляется и дано <p:commandButton>
изменяется следующим образом,
<p:commandButton actionListener="#{testManagedBean.submitAction}"
update="panel dataTable" value="Submit"/>
удаление oncomplete="if(!args.validationFailed) {updateTable();}"
и update
атрибут изменен с update="panel"
в update="panel dataTable"
затем <p:inputText>
не вызывает проверки, когда строка в <p:dataTable>
обновляется.
Как предотвратить <p:inputText>
от выполнения проверок, когда строка в <p:dataTable>
обновляется с помощью <p:ajax>
который, в свою очередь, обновляет <p:panel>
держа <p:inputText>
обсуждаемый?
<p:remoteCommand>
Сам в этом случае не может быть опущен. Надо обновить <p:dataTable>
только если никакие проверки не нарушены. В противном случае дорогостоящие бизнес-услуги выполняются без необходимости, даже при наличии ошибок проверки.
Связанный управляемый компонент JSF (хотя и совершенно ненужный).
@ManagedBean
@ViewScoped
public final class TestManagedBean extends LazyDataModel<Category> implements Serializable
{
@EJB
private final CategoryBeanLocal categoryService = null;
private String txtValue; //Getter and setter.
private static final long serialVersionUID = 1L;
@Override
public List<Category> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
setRowCount(categoryService.rowCount().intValue());
return categoryService.getList(first, pageSize, multiSortMeta, filters);
}
public void submitAction() {
System.out.println("txtValue : " + txtValue);
txtValue = null;
}
public void onRowEdit(RowEditEvent event) {
System.out.println("onRowEdit() called.");
}
}
1 ответ
После этого, если ряд удерживается данным
<p:dataTable>
обновляется (что, в свою очередь, обновляет<p:panel id="panel">
с помощью<p:ajax>
внутри<p:dataTable>
, Иногда необходимо), данный<p:inputText>
в<p:panel id="panel">
вызывает проверку, ее границы становятся красными, подразумевая нарушение соответствующей проверки, которая не должна происходить.
Это не то, что происходит. Если бы это было правдой, вы бы увидели 3 HTTP-запроса на сетевом мониторе. Но есть только 2 (один из представленных панели и один из <p:remoteCommand>
).
Причиной является <p:remoteCommand>
сам. это process
атрибут по умолчанию @all
("весь вид"). Вы также можете подтвердить это, проверив javax.faces.partial.execute
параметр запроса в мониторе сети. Это говорит @all
, Другими словами, вся форма также отправляется / обрабатывается, включая эти пустые входные данные.
Вы должны явно установить его @this
:
<p:remoteCommand name="updateTable" process="@this" update="dataTable"/>