就是这样,我一直在用xpages开发,因为我们介绍了,所以我觉得我有点知道我在做什么。然而,这一案件让我疯狂。
我有两个组合框,一个ShipTo和一个BillTo。 ShipTo选项将更新BillTo组合框的选项。没什么好看的。
这就是问题所在。页面打开时,两个字段都设置为默认值。如果我选择不同的ShipTo,BillTo选项会更改(正如预期的那样,从面板部分刷新)但是ShipTo字段中的onChange ssjs代码不会运行。跟我来,这里....当我更改ShipTo时,它会部分刷新封闭的面板onChange。重新计算的第一件事是BillTo字段的选择。然后,在ShipTo字段中触发onChange ssjs。这不是人们所期望的,但我的控制台消息显示这是真的。
因此,当BillTo有一个值(即不是" -Select - ")时,onChange ssjs不会触发。一旦BillTo刷新到-Select-(因为ShipTo更改),那么ShipTo onChange ssjs将运行得很好。每次。直到我选择BillTo ...然后onChange ssjs将无法运行。
疯了,我知道。但是,这是针对客户应用程序的,所以我需要弄清楚它。
这是BillTo =" - 选择 - "
时的控制台HTTP JVM:获取billto选项
HTTP JVM:... billto值完成
HTTP JVM:shipto onchange
HTTP JVM:sel = CelayaH4999
现在,当我选择一个有效的BillTo(那里没有刷新或更改事件)然后重新选择ShipTo时,我得到了这个......
HTTP JVM:获取billto选项
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选项返回一个新数组(&#34; bob&#34;,&#34; tim&#34;),那么无论BillTo选择是什么,它们都可以正常工作。但是,当我按计算返回BillTo选项时,它不起作用。因此,BillTo选择公式似乎存在问题,但我找不到任何错误。
有人可以识别我犯的愚蠢错误吗? - 或者,指出我正确的方向让它得到澄清?
答案 0 :(得分:0)
我将问题缩小到此:ShipTo选项更改了BillTo字段的选项。如果BillTo是-Select-那么一切正常,因为-Select-始终是任何ShipTo的有效选择。但是,如果BillTo有一个有效的选择,那么当ShipTo被更改时,BillTo选择现在不再适用于新的BillTo选项。这导致ShipTo onChange事件无法运行。 (记住,BillTo选择公式在ShipTo onChange之前运行)
我找不到解决方案,所以我只是使用了一种解决方法。
我将ShipTo onChange代码放在脚本库函数中,然后在ShipTo onChange事件和BillTo选择选项公式中调用它。所以,现在,如果当前的BillTo选择与BillTo的新选择列表不匹配,那么我从选择公式调用ShipTo onChange函数 - 因为我知道一旦计算出选择,它就不会运行。这种解决方法有效,但我觉得这个问题可能会在将来再次让我感到厌烦。
现在我已经有了更好的理解,你可以通过使用两个组合框来自己测试它,其中第二组选择取决于第一个框选择。在第一个框中更改打印声明onChange并且您将看到它不会触发,除非第二个框选择与基于第一个框选择的新选择集匹配。
我不能解释它,但我希望这篇文章可以帮助其他人。