【发布时间】:2018-02-13 23:27:55
【问题描述】:
仅供参考,自从引入 xpages 以来,我一直在使用它们进行开发,所以我觉得我有点知道自己在做什么。然而,这一个案例让我发疯了。
我有两个组合框,一个 ShipTo 和一个 BillTo。 ShipTo 选择将更新 BillTo 组合框的选择。没什么特别的。
这就是问题所在。当页面打开时,两个字段都设置为默认值。如果我选择不同的 ShipTo,BillTo 选项会发生变化(正如预期的那样,从面板部分刷新)但 ShipTo 字段中的 onChange ssjs 代码不会运行。跟我来,在这里....当我更改 ShipTo 时,它会部分刷新封闭面板 onChange。重新计算的第一件事是 BillTo 字段的选择。然后,在 ShipTo 字段中触发 onChange ssjs。这不是人们所期望的,但我的控制台消息表明这是真的。
因此,当 BillTo 有一个值(即 not = "-Select-")时,onChange ssjs 不会触发。一旦 BillTo 刷新为 -Select- (因为 ShipTo 更改),ShipTo onChange ssjs 就会运行良好。每次。直到我选择一个 BillTo... 然后 onChange ssjs 将不会运行。
疯了,我知道。但是,这是针对客户应用程序的,所以我需要弄清楚。
这是 BillTo = "-Select-" 时的控制台
HTTP JVM:获得账单选择
HTTP JVM: ... billto 值完成
HTTP JVM:shipto onchange
HTTP JVM:sel=CelayaH4999
现在,当我选择一个有效的 BillTo(那里没有刷新或 onchange 事件)然后重新选择一个 ShipTo 时,我得到了这个...
HTTP JVM:获得账单选择
HTTP JVM: ... billto 值完成
ShipTo onChange ssjs 永远不会运行。去图吧。
这是我的测试页面:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="Entry1">
<xp:this.postNewDocument>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:document1.replaceItemValue("CurrentForm","Entry1");
var res = InitializeWF("Entry1",document1,true); //newdoc
var res = InitializeDefaults(document1);
document1.replaceItemValue("ShipToKeyx",document1.getItemValueString("ShipToKey"));
document1.replaceItemValue("BillToKeyx",document1.getItemValueString("BillToKey"));
document1.replaceItemValue("MpxLoc","Y"); //for compatibility
}]]></xp:this.script>
</xp:executeScript>
</xp:this.postNewDocument></xp:dominoDocument>
</xp:this.data>
<xp:this.resources>
<xp:script src="/xpServerSide.jss" clientSide="false"></xp:script>
</xp:this.resources>
<xp:panel id="panelPage">
<xp:comboBox id="ShipToKey" value="#{document1.ShipToKeyx}">
<xp:selectItems id="selectItems5">
<xp:this.value><![CDATA[#{javascript:var list = @DbColumn(@DbName(),"shpmstlookupui",9);
list.sort();
list.unshift("-Select-");
@Unique(list)}]]></xp:this.value>
</xp:selectItems>
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="panelPage" id="eventHandler9">
<xp:this.action>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:print("shipto onchange")
var sel = getComponent("ShipToKey").getValue();
print("sel="+sel)
var res = true;
if(sel==null || sel=="" || sel=="-Select-"){
document1.replaceItemValue("ReqShipToAddress","");
res = false;
}
if(res){
var sview = database.getView("shpmstlookupui");
var vdoc = sview.getDocumentByKey(sel,true);
if(vdoc!=null){
document1.replaceItemValue("ReqShipToAddress",vdoc.getItemValue("ShipFull"));
}
}
//verify billto is from this same whs
//print("shipwh = " + document1.getItemValueString("ShipWh")+", billwh = "+document1.getItemValueString("BillWh"))
if(!res || document1.getItemValueString("ShipWh")!=document1.getItemValueString("BillWh")){
document1.replaceItemValue("BillToKey","-Select-");
}
}]]></xp:this.script>
</xp:executeScript>
</xp:this.action>
</xp:eventHandler>
</xp:comboBox>
<xp:br></xp:br>
<xp:text escape="false" id="computedField11">
<xp:this.value><![CDATA[#{javascript:var list = new Array(document1.getItemValue("ReqShipToAddress"));
//print("shipto address list len = "+list.length+", list = "+list)
if(list.length==0){return null;}
return "<UL style='list-style-type: none;padding: 0px;margin: 0px'><LI>" + @Implode(list,"<LI>") + "</UL>";}]]></xp:this.value>
</xp:text>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:comboBox id="BillToKey" value="#{document1.BillToKeyx}">
<xp:selectItems id="selectItems6">
<xp:this.value><![CDATA[#{javascript:var tmparrx = new Array("bob","tim")
tmparrx.sort();
tmparrx.unshift("-Select-");
print("getting billto choices ==============================================================================")
var sel = getComponent("ShipToKey").getValue();
if(sel==null || sel=="-Select-" || sel==""){
print("sel is null, returning tmparrx");
return @Unique(tmparrx);
//try xsp value
sel = document1.getItemValueString("ShipToKey");
if(sel==null || sel=="-Select-" || sel==""){
var shipwh = null;
}
else {
var shipwh = null;
var sview = database.getView("shpmstlookupui");
var vdoc = sview.getDocumentByKey(sel,true);
if(vdoc!=null){
shipwh = vdoc.getItemValueString("Shipwh");
}
}
}
else {
var shipwh = null;
var sview = database.getView("shpmstlookupui");
var vdoc = sview.getDocumentByKey(sel,true);
if(vdoc!=null){
shipwh = vdoc.getItemValueString("Shipwh");
}
// print("got shipwh = "+shipwh)
// return @Unique(tmparrx);
}
if(shipwh==null){return null;}
var list = @DbLookup(@DbName(),"shpmstlookup2",shipwh,9);
if(typeof list==="string"){
var tmparr = new Array(list);
}
else {
var tmparr = list;
}
tmparr.sort();
tmparr.unshift("-Select-");
print("... billto values complete");
//return @Unique(tmparrx);
return @Unique(tmparr);
/*
//check existing selection
var sel = document1.getItemValueString("BillToKey");
print("initial value = "+sel)
var found = false;
for(x=0;x<tmp2.length;x++){
var entry = tmp2[x];
if(entry.toLowerCase().indexOf(sel.toLowerCase())>=0){
print("found = true")
found = true;
}
}
if(!found){
print("not found")
document1.replaceItemValue("BillToKey","-Select-");
}
var sel = document1.getItemValueString("BillToKey");
print("post value = "+sel)
tmp2
*/}]]></xp:this.value>
</xp:selectItems>
</xp:comboBox>
<xp:br></xp:br>
<xp:br></xp:br>
</xp:panel>
</xp:view>
这是最疯狂的事情。
如果我为 BillTo 选项返回一个新的 Array("bob","tim"),那么无论 BillTo 选项是什么,一切都会正常运行。但是,当我按计算返回 BillTo 选项时,它就不起作用了。所以,BillTo 选择公式似乎有问题,但我找不到任何错误。
有人能找出我犯的愚蠢错误吗? - 或者,指出我正确的方向来解决这个问题?
【问题讨论】:
-
尝试用数据源调用(即 document1.getValue(“ShipToKeyx”) 等)替换所有 getComponent 调用,以确保获得实际更改的值
-
谢谢,但是这些值被正确提取了。