Xpages:值更改时在页面上加载字段值-绑定到bean

Xpages:值更改时在页面上加载字段值-绑定到bean,xpages,Xpages,请参阅本电子邮件底部的说明 我有一个Xpage,用户将在其中选择一个雇员,然后填充一系列与雇员相关的字段。在我的源代码是文档时,我曾经这样做过,但现在我使用的是对象。我的对象绑定到一个Javabean 由于某些原因,当员工姓名更改时,我无法启动on change事件;在其他时候,我可以触发事件,但是当我尝试将选择发送到java方法以加载值时,我无法获取字段的值 我认为我必须做的是将代码放入employee字段的onChange事件中,该事件获取用户选择的值,然后在我的bean中调用一个java

请参阅本电子邮件底部的说明

我有一个Xpage,用户将在其中选择一个雇员,然后填充一系列与雇员相关的字段。在我的源代码是文档时,我曾经这样做过,但现在我使用的是对象。我的对象绑定到一个Javabean

由于某些原因,当员工姓名更改时,我无法启动on change事件;在其他时候,我可以触发事件,但是当我尝试将选择发送到java方法以加载值时,我无法获取字段的值

我认为我必须做的是将代码放入employee字段的onChange事件中,该事件获取用户选择的值,然后在我的bean中调用一个java方法,该方法将加载其他employee值,然后重新加载面板。天哪,连写那个都要花很长时间

任何帮助都将不胜感激

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom"
    xmlns:xe="http://www.ibm.com/xsp/coreex"
    createForm="false">
    <xp:panel
        id="pnlAll">
        <xp:eventHandler
            event="refresh"
            submit="false"
            refreshMode="partial"
            loaded="false"/>    
        <xp:this.data>
            <xe:objectData
                saveObject="#{javascript:tr.save()}"
                var="tr">
                <xe:this.createObject><![CDATA[#{javascript:var tr = new com.scoular.model.TerminationRequest();
var unid = context.getUrlParameter("key")

if (unid != "") {
    tr.loadByUnid(unid);
    viewScope.put("readOnly","Yes");
} else {
    tr.create();
    viewScope.put("readOnly","No");
}
return tr;}]]></xe:this.createObject>
            </xe:objectData>
        </xp:this.data>
        <xp:div
            styleClass="container-fluid"
            id="divTravelRequest">



            <div
                class="panel panel-primary"
                id="div6">
                <div
                    id="divEmployeeInfo"
                    class="panel-collapse collapse in">
                    <div
                        class="panel-body"> 
                        <!--Row-->
                        <div
                            class="row">
                            <div
                                id="div2">
                                <div
                                    class="col-sm-6 pull-left">
                        <xp:inputText
                        value="#{tr.employeeName}"
                        id="employeeName1"
                        style="width:300px"
                        xp:key="field">
                        <xp:eventHandler
                            event="onchange"
                            submit="true"
                            refreshMode="norefresh"
                            id="eventHandler1">
                            <xp:this.action><![CDATA[#{javascript:var prmEmpNme:String = getComponent("employeeName1").getValue();
var javaClass = new com.scoular.model.TerminationRequest();
javaClass.setEmployeeData(prmEmpNme);}]]></xp:this.action>
                        </xp:eventHandler>
                        </xp:inputText>

                    &#160;&#160;&#160;

                    <xe:namePicker
                        id="namePicker2"
                        dialogTitle="Select a Name"
                        for="employeeName1" rendered="false">
                        <xe:this.dataProvider>
                            <xe:dominoNABNamePicker
                                addressBookDb="bryansMac!!names.nsf"
                                addressBookSel="db-name"
                                nameList="people"
                                people="true" />
                        </xe:this.dataProvider>
                        <xe:this.dojoAttributes>
                            <xp:dojoAttribute
                                name="maxRowCount"
                                value="1000" />
                        </xe:this.dojoAttributes>
                    </xe:namePicker>

                                            <xp:listBox
                                                xp:key="field"
                                                id="listBoxEmpNme"
                                                style="width: 100% !important;"
                                                value="#{tr.employeeName}">
                                                <xp:selectItems>
                                                    <xp:this.value><![CDATA[#{CacheBean.employees}]]></xp:this.value>
                                                </xp:selectItems>
                                                <xp:eventHandler
                                                    event="onchange"
                                                    submit="true"
                                                    refreshMode="norefresh">
                                                    <xp:this.action><![CDATA[#{javascript:var scriptCode = "alert('This got fired')"
view.postScript(scriptCode); }]]></xp:this.action>
                                                </xp:eventHandler></xp:listBox>

                                            <xp:div
                                        style="height:10.0px" />


<xp:scriptBlock id="scriptBlock2">
<xp:this.value><![CDATA[$(document).ready(
function() {
x$( "#{id:listBoxEmpNme}" ).select2({
placeholder: "Select The Scoular Employee To Term",
allowClear: true
});
}
);]]></xp:this.value>
            </xp:scriptBlock>                                       
            <xp:div style="height:10.0px" />
            </div>
                <div class="col-sm-6 pull-right">

                        <xp:inputText
                                id="inputText2"
                                xp:key="field"
                                value="#{tr.employeeLocation}">
                                <xp:this.disabled><![CDATA[#{javascript:true}]]></xp:this.disabled>
                                </xp:inputText>
                                </div>

                            </div>
                        </div>

                    </div>
                </div>
            </div>
        </xp:div>
    </xp:panel>
    </xp:view>

   
============================

我遇到的问题是,当用户更改employeeName的值时,会触发部分刷新,但已更改的值[employeeName]不会反映在支持bean中。如果我能做到这一点,那么一切都会好起来。

在onchange方法中,您创建了新的java对象,并且不再使用该对象。您可能应该参考以前创建的ObjectData。 第二件事是将输入控件的refreshMode属性设置为norefresh。即使您更新了数据,页面也不会被刷新,您也不会看到结果。尝试完全模式或父系模式。检查下面的代码

<xp:inputText
value="#{tr.employeeName}"
id="employeeName1"
style="width:300px"
xp:key="field">
<xp:eventHandler
    event="onchange"
    submit="true"
    refreshMode="complete"
    id="eventHandler1">
    <xp:this.action><![CDATA[#{javascript:var prmEmpNme:String = getComponent("employeeName1").getValue();
    tr.setEmployeeData(prmEmpNme);}]]>
    </xp:this.action>
</xp:eventHandler>


这是一个示例,您可以将示例XPage简化为必要的内容

它使用Select2并对listBox的onchange事件执行XSP.partialRefreshPost

XSP.partialRefreshPost将列表框值employeeName提交给服务器,并获取刷新的面板panelRefresh。服务器调用bean的方法
setEmployeeName(employeeName)
在bean中设置新的employeeName值,并调用
getEmployeeLocation()
获取employeeLocation





为什么将createForm设置为false?这意味着没有可以提交的表单。这可以解释你的问题,我不确定。我相信我之所以在另一个项目上这样做是有原因的,我从那个项目中复制了代码。我将删除此项,看看这是否解决了问题。我想回应@PerHenrikLausten对
createForm=“false”
的担忧,因为这会干扰页面正常发回更改的方式。另外,第一个
xp:eventHandler
块在做什么?绑定到
xp:panel
的一个;我会删除它(即使它声称
loaded=“false”
,您显然不想要它),因为我只在高级绑定的
eventHandler
s中遇到了问题,它与实际事件没有直接关联。我同意我应该删除这两个东西,我已经这样做了。我最初的问题基本上已经解决了,但还没有完全解决。我无法将onChange事件与Select2一起使用,因此dizdman在下面所写的内容很不幸无法工作。我发现我必须使用一个面板作为JS代码中刷新的目标,所以我已经这样做了,面板中的项目也得到了刷新。问题是触发刷新(对employeeName的更改)的项没有绑定到后端bean,因此我的更新将失败。我会把代码放在上面。