当输入字段中的值在p:dataTable的行中发生更改时,有条件地更新选择列表

时间:2014-05-05 06:16:41

标签: jsf-2 primefaces

我需要根据输入字段中的值更新选择列表。由于更新延迟,我不想更新选择列表,如果它已经有正确的选项。我不应该太困难并且尝试过这个:

<p:inputText value="#{bean.inputValue}"> 
      <p:ajax update="#{bean.updateElement}">               
</p:inputText> /
<h:selectOneMenu id="so" value="#{bean.soValue}">
      <f:selectItem />
      <f:selectItems value="#{bean.options}" var="option" itemLabel="#{option}"/>
</h:selectOneMenu>

但它不起作用,因为当输入字段中的值发生更改时,bean.updateElement不会被调用。

好的,我需要使用p:remoteCommand。我确信这可以解决这个问题:

<p:ajax oncomplete="updateSelect()"/>

...

<p:remoteCommand name="updateSelect" update="dt:so" oncomplete="alert('done')" />

字段位于p:dataTable id="dt"行。我收到警报,但仍未调用bean.options。如果我将其更改为update="dt"它可以工作并且整个数据表已更新,但这不是我想要的。我还尝试使用so form:dt:so:form:dt:so

然后我尝试了几个我能找到的选项:

RequestContext.getCurrentInstance().update("dt:so");

...

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("dt:so");

但没有任何反应。没有dt:也试过。

修改

我更接近这一步:

<p:ajax update="@this #{bean.updateElement}"/>

现在每次更改输入字段值时都会调用bean.updateElement但是选择组件在下次更改输入字段值之前不会更新。 bean.updateElement返回“so”或“”,具体取决于输入字段值。

编辑2:

使用此选项可在输入字段被修改时保留所选选项:

<f:ajax execute="so" render="so" partialSubmit="true" />

我也试过<p:ajax process="so" update="so />,但选项不再更新了。保持选择的选项是我的目标之一,所以这很好,但可能会更好。

我怎样才能让这件事非常简单?我的设置是:

  • Tomcat 7.0.53
  • Mojarra 2.2.7
  • primefaces-5.0.jar
  • JRE 1.8.0_05

2 个答案:

答案 0 :(得分:0)

我不确定,您的方法updateElement的作用是什么,但在

<p:ajax update="#{bean.updateElement}">

属性update应包含要更新的组件的ID。 所以这可能适合你:

<p:ajax listener="#{bean.updateElement}" update="so">

答案 1 :(得分:0)

我正在使用这条ajax线:

<p:ajax partialSubmit="true" oncomplete="checkIt(#{iIndex})" />

这会调用我的JS函数将行索引传递给它。该函数将检查是否需要更新选择列表。如果是,那么我点击JavaScript中的这个按钮:

<p:commandButton id="btnUpdateList" update="so" partialSubmit="true" style="display:none"/>

这种方式可行,但列表更新有点慢,可能是因为它进入服务器两次。