有人可以帮我解决XPage中的奇怪页面刷新问题吗?

时间:2018-02-12 20:40:26

标签: javascript xpages-ssjs

就是这样,我一直在用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选择公式似乎存在问题,但我找不到任何错误。

有人可以识别我犯的愚蠢错误吗? - 或者,指出我正确的方向让它得到澄清?

1 个答案:

答案 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并且您将看到它不会触发,除非第二个框选择与基于第一个框选择的新选择集匹配。

我不能解释它,但我希望这篇文章可以帮助其他人。