【问题标题】:JSF (and PrimeFaces) How to pass parameter to a method in ManagedBeanJSF(和 PrimeFaces)如何将参数传递给 ManagedBean 中的方法
【发布时间】:2012-03-21 13:09:01
【问题描述】:

我在 inputtext 中显示了一个 Employee 对象。 例如,员工的名字显示在输入文本中。当这个名字的值改变时,它会调用一个方法。在此之前,我想调用一个方法,将员工的 ID 保存在 managedbean 中,这样我就知道需要更改哪个员工。 我该怎么做,到目前为止我得到了这个:

<h:outputText value="First name:"/>
<p:inplace id="firstname" editor="true">
     <p:ajax event="save" onsuccess="#{employeeController.saveName()}"/>
     <p:inputText id="firstName" value="#{emp.firstName}"  
                  required="true" label="text"
                  valueChangeListener="#{employeeController.firstNameChanged}">
     <p:ajax event="valueChange" listener="#{employeeController.onValueChangedStart}"/>
     </p:inputText>
</p:inplace>

我想我应该使用 onValueChangedStart 或 firstNameChanged 方法传递 ID。我该怎么做呢?还是有更好的方法来做到这一点? emp 有一个吸气剂。所以#{emp}.id 得到它。

【问题讨论】:

  • 这是在数据表中吗? #{emp} 不是 #{employeeController} 的属性,乍一看很奇怪。
  • 这是在数据表中。所以你给出的答案很有帮助

标签: java jsf xhtml primefaces managed-bean


【解决方案1】:

假设您确实位于重复组件中,其中 #{emp} 被其 var 属性公开,您可以从值更改侦听器内的 EL 范围中获取它,如下所示:

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...

或者,如果将&lt;h:dataTable&gt;value 包装在DataModel&lt;Employee&gt; 中,则可以按如下方式获取当前行:

Employee employee = model.getRowData();
Long id = employee.getId();
// ...

与具体问题无关,值变化不需要两个监听方法。请注意,valueChangeListener 让您有机会通过事件获取旧值和新值,而p:ajax listener 不是,此时新值已设置为模型值。如果您需要旧值和新值,请删除&lt;p:ajax&gt;listener 属性。 event="valueChange" 已经是默认事件了,所以也删除它。

【讨论】:

  • 你知道是否也可以再次渲染原地?它仍然显示旧值。
  • 这似乎不起作用,我放了一个带有警报的javascript来测试它是否呈现,它确实如此。但它看起来像是在改变值之前渲染它。我使用 当我刷新页面时它确实具有正确的值。
  • 请提出一个新问题。这与最初的问题无关。
  • 解决了添加 p:ajax 事件="save" update="@this"。在另一个 p:ajax 行下面添加了这个。
  • 我已经修改了 BalusC 的这个建议,使用“优雅的黑客”来利用 p:inplace 的 id 来传播(到保存事件侦听器)实体的 EL 表达式的翻译形式其值正在被就地编辑:stackoverflow.com/questions/11405613/…
【解决方案2】:

使用 primefaces ajax 可以在 java 中检索输入的值:

public void onValueChanged(AjaxBehaviorEvent event)
{
    Employee employee = (Employee)((UIOutput)event.getSource()).getValue();
    //...
}

<h:selectOneMenu required="true"
    value="#{empl}" converter="#{bean.employeeConverter}">
    <f:selectItems value="#{bean.employees}" var="varEmployee" 
        itemLabel="#{varEmployee}" itemValue="#{varEmployee}"/>
    <p:ajax event="change" listener="#{bean.onValueChanged}"/>
</h:selectOneMenu>

由于您的值是字符串,因此您可以转换为字符串,而不是转换为员工,或者使用员工对象并使用转换器或其 toString() 方法。

【讨论】:

    【解决方案3】:

    试试

    <p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2014-02-03
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多