【问题标题】:Primefaces event pass attribute only first timePrimefaces 事件传递属性仅第一次
【发布时间】:2017-09-10 10:33:03
【问题描述】:

我遇到了一段时间的问题,但我无法摆脱它。在我的数据表中,我有一列带有一个按钮,用于显示一个对话框,其中包含有关点击的更多信息。

当我第一次单击按钮时,对话框以正确的值打开,但是当我第二次单击同一行的按钮或任何其他按钮时,值不会显示,因为我的事件处理程序 findStfPack 接收一个空值属性。

我尝试将要显示的PackageData对象作为参数直接传递给方法:

<p:column width="60">
  <p:commandButton oncomplete="PF('dlgViewStfPack').show()" 
                   update="search:dlgViewStfPackId"
                   value=""
                   title="#{msg['button.search']}"
                   action="#{budgetViewFulfiledController.findStfPack(_item.stfPack)}"
                   process="@this"/>
</p:column>

视图控制器中的处理方法:

public void findStfPack(PackageData event){
  System.out.println("event: "+event.getPackId());
  stfPack= event;
}

或使用 primefaces 动作事件:

<p:column width="60">
  <p:commandButton oncomplete="PF('dlgViewStfPack').show()"
                   update="search:dlgViewStfPackId"
                   value=""
                   title="#{msg['button.search']}"
                   actionListener="#{budgetViewFulfiledController.findStfPack}"
                   process="@this">
    <f:attribute name="pack" value="#{_item.stfPack}"/>
  </p:commandButton>
</p:column>

视图控制器中的处理方法:

public void findStfPack(ActionEvent event){
  PackageData packageData= (PackageData)event.getComponent().getAttributes().get("pack");
  System.out.println("event: "+packageData.getPackId());
  stfPack= packageData;
}

对话框:

<p:dialog id="dlgViewStfPackId"
          header="#{budgetViewFulfiledController.stfPack.staff.stfName} - Package salarial"
          modal="true"
          widgetVar="dlgViewStfPack">
  <div class="groupDataBox">
    <my:outputCurrentPackage currPack="#{budgetViewFulfiledController.stfPack}"/>
  </div>
</p:dialog>

两种情况下的结果是相同的:在第一个事件触发器上,值被正确传递和显示,但在第二个事件触发器上,我得到了 NullPointerException

我应该指定,我不知道为什么,但没有update="search:dlgViewStfPackId",值不会显示在对话框中。

【问题讨论】:

标签: jsf primefaces jsf-2 primefaces-datatable


【解决方案1】:

具体原因我不知道,但是如果你不更新对话框,数据不能刷新,它会被缓存最后的结果。 尝试像这样改变:

XHMTL

<p:column width="60">
    <p:commandButton oncomplete="PF('dlgViewStfPack').show()"
               update="@([$id=dlgViewStfPackId])"
               value=""
               title="#{msg['button.search']}"
               action="#{budgetViewFulfiledController.findStfPack(_item.stfPack)}"
               process="@this">

    </p:commandButton>
</p:column>

JAVA

public void findStfPack(PackageData pd){
    System.out.println("event: "+pd.getPackId());
    this.stfPack= pd;
}

如果不起作用,尝试处理 ID_TABLE

【讨论】:

  • 请记住,它 确实 工作 once 如 OP 所述,并且 OP 这样做:update="search:dlgViewStfPackId" 位于我认为更新对话框,所以最多它的值是错误的,也许将它添加到你的答案中,但在这种情况下,这个问题与stackoverflow.com/questions/8634156/… 重复,并且 OP 应该得到一个错误(可能取决于在开发模式下运行与否)并且没有更新属性它甚至不会工作一次,所以它是'好的'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多