【问题标题】:Can someone help me with a strange page refresh issue in XPages?有人可以帮我解决 XPages 中一个奇怪的页面刷新问题吗?
【发布时间】: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 调用,以确保获得实际更改的值
  • 谢谢,但是这些值被正确提取了。

标签: javascript xpages-ssjs


【解决方案1】:

我将问题缩小到这个范围: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 中放置一条打印语句,您会看到它不会触发,除非第二个框选择与基于第一个框选择的新选择集之一匹配。

我无法解释更多,但我希望这篇文章可以帮助其他人。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多