Xpages:值更改时在页面上加载字段值-绑定到bean
请参阅本电子邮件底部的说明 我有一个Xpage,用户将在其中选择一个雇员,然后填充一系列与雇员相关的字段。在我的源代码是文档时,我曾经这样做过,但现在我使用的是对象。我的对象绑定到一个Javabean 由于某些原因,当员工姓名更改时,我无法启动on change事件;在其他时候,我可以触发事件,但是当我尝试将选择发送到java方法以加载值时,我无法获取字段的值 我认为我必须做的是将代码放入employee字段的onChange事件中,该事件获取用户选择的值,然后在我的bean中调用一个java方法,该方法将加载其他employee值,然后重新加载面板。天哪,连写那个都要花很长时间 任何帮助都将不胜感激Xpages:值更改时在页面上加载字段值-绑定到bean,xpages,Xpages,请参阅本电子邮件底部的说明 我有一个Xpage,用户将在其中选择一个雇员,然后填充一系列与雇员相关的字段。在我的源代码是文档时,我曾经这样做过,但现在我使用的是对象。我的对象绑定到一个Javabean 由于某些原因,当员工姓名更改时,我无法启动on change事件;在其他时候,我可以触发事件,但是当我尝试将选择发送到java方法以加载值时,我无法获取字段的值 我认为我必须做的是将代码放入employee字段的onChange事件中,该事件获取用户选择的值,然后在我的bean中调用一个java
<?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>
   
<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,因此我的更新将失败。我会把代码放在上面。