从绑定到托管bean的radiobutton组获取值

时间:2017-04-19 07:30:41

标签: java xpages xpages-ssjs

在我的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>

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

我尝试通过部分刷新选项设置可见性,但我总是得到返回的值,通过我的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>

因此,当加载并且值为No时,如果我将radiobutton设置为Yes,则它仍为No。

我应该如何从radiobutton中收集(更改过的)值?

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>

2 个答案:

答案 0 :(得分:2)

请考虑以下事项:

<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>

豆类成分。我使用了地图,因为我对你的Employee类:)一无所知:

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语言。从长远来看,它不会帮助你。此外,观察源是痛苦的。尽可能多地使用EL表达式,力求永远
  2. 不要将Java字符串与==进行比较,而应与.equals
  3. 进行比较
  4. 确保您要刷新的块实际上可以刷新(请参阅为什么我让xp:div id="example始终可见,但随后添加了一个检查staffMember值的内部标记)。这并不意味着你必须这样做。这取决于你如何构建你的XPage。
  5. 使用execMode缩小POST范围。力争表现

答案 1 :(得分:0)

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