从绑定到托管 bean 的单选按钮组获取值

getting value from radiobutton group that is binded to a managed bean

在我的 XPage 上,我有一个绑定到托管 bean 的单选按钮组控件:

<xp:radioGroup value="#{employeeBean.employee.staffMember}" id="radioStaff">
    <xp:selectItem itemLabel="Yes" />
    <xp:selectItem itemLabel="No" />
    <xp:eventHandler event="onchange" submit="true" refreshMode="partial" refreshId="radioStaffDept"></xp:eventHandler>
</xp:radioGroup>

当设置为是时,我想显示另一个输入字段以输入部门。

我尝试通过部分刷新选项设置可见性,但我总是得到返回的值,它是如何通过我的 bean 设置的。

我测试通过以下方式收集它的价值:

<xp:text escape="true" id="computedField1">
    <xp:this.value><![CDATA[#{javascript:
var radio1:com.ibm.xsp.component.xp.XspInputRadio = getComponent("radioStaff");
return radio1.getValue()}]]></xp:this.value>
</xp:text>

所以当加载并且值为否时,如果我将单选按钮设置为是它仍然是否。

我应该如何从单选按钮收集(更改的)值?

Ps 我尝试添加绑定 属性(例如 binding="#{myValue}"),但通过此方法得到了相同的意外结果。

PPs 我还尝试在 onChange 事件上设置 staffMember 字段,但这也不起作用 (employeeBean.employee.setStaffMember("Yes");)

===

我不确定我是否理解正确 是的,使用以下代码我可以检查一个人是否是工作人员,但是当我更改时,我如何(暂时)将值写回我的 bean 中的提案对象单选按钮中的选项?

private Employee employee;

    public Boolean isStaffMember(){
        if (employee.getStaffMember()=="Yes"){
            return false;
        }
        else{
            return true;
        }
    }

    public void setStaffMember(String value){
        employee.setStaffMember(value);
    }


  <xp:radioGroup
                            value="#{employeeBean.employee.staffMember}"
                            binding="#{staffMember}" id="radioStaffMember">
                            <xp:selectItem itemLabel="Yes" />
                            <xp:selectItem itemLabel="No" />
                            <xp:eventHandler event="onchange"
                                submit="true" refreshMode="partial"
                                refreshId="pnlStaffMemberDept" >
                                <xp:this.action><![CDATA[#{javascript:var thisVal = getComponent("radioStaffMember").getValue();
employeeBean.setStaffMember(thisVal);}]]></xp:this.action>
                            </xp:eventHandler>
                        </xp:radioGroup>

您不会追求 UI 组件。为了可见性,请使用您在 bean 上作为布尔方法提供的 EL 表达式 employeeBean.isStaffMember。 只需确保您的部分刷新目标(一个面板?)包括您的单选按钮和额外字段

考虑以下几点:

<p>Staff member?</p>

<xp:radioGroup value="#{employeeBean.employee.staffMember}"
    id="radioStaff">
    <xp:selectItem itemLabel="Yes" />
    <xp:selectItem itemLabel="No" />
    <xp:eventHandler event="onchange" submit="true"
        execMode="partial" refreshMode="partial" refreshId="examples" />
</xp:radioGroup>

<xp:div id="examples">
    <xp:text disableOutputTag="true"
        rendered="#{not empty employeeBean.employee.staffMember}">
        <p>
            <xp:text value="The value is: #{employeeBean.employee.staffMember}" />
        </p>

        <p>
            <xp:text value="A staff member (checkbox string value evaluation)"
                rendered="#{employeeBean.employee.staffMember eq 'Yes'}" />
        </p>

        <p>
            <xp:text value="A staff member (boolean value evaluation)"
                rendered="#{employeeBean.staffMember}" style="color: green" />
        </p>

        <p>
            <xp:text value="Not a staff member (boolean value evaluation)"
                rendered="#{not employeeBean.staffMember}" style="color: red" />
        </p>
    </xp:text>
</xp:div>

和bean组成。我用了一张地图,因为我对你的 Employee class 一无所知 :) :

public class EmployeeBean implements Serializable {

  private static final long serialVersionUID = 1L;

  private Map<String, Object> employee;

  public Map<String, Object> getEmployee() {
    if (employee == null) {
        employee = new HashMap<String, Object>();
    }

    return employee;
  }

  public boolean isStaffMember() {
        return "Yes".equals(getEmployee().get("staffMember"));
  }

}

一些建议:

  1. 尽量少用 javascript 语言。长期 运行 对您没有帮助。此外,source 看起来很痛苦。尽量用EL表达式,争取永远
  2. 不要将 Java 字符串与 == 进行比较,而应将其与 .equals
  3. 进行比较
  4. 确保您要刷新的块实际上可以刷新(看看为什么我让 xp:div id="example 始终可见,但随后添加了一个检查 staffMember 值的内部标记)。这并不意味着您必须这样做。这取决于您构建 XPage 的方式。
  5. 使用 execMode 缩小 POST 范围。力求表现