Xpages无法使getComponent在Ext:对话框中工作

Xpages无法使getComponent在Ext:对话框中工作,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我在对话框中有一个值选择器。用户选择一个值并将该值输入到一个编辑框中,该编辑框绑定到一个范围变量。到目前为止还不错 然后我有一个按钮,我想问访问编辑框中的值 我试过使用 var satLoc:String = viewScope.get("selLoc"); var satLoc:String = getComponent("selLoc").getValue(); 这两个都不起作用-我只是得到空值 我的代码如下。我希望能得到一些帮助 <?xml version="1.0" encodi

我在对话框中有一个值选择器。用户选择一个值并将该值输入到一个编辑框中,该编辑框绑定到一个范围变量。到目前为止还不错

然后我有一个按钮,我想问访问编辑框中的值

我试过使用

var satLoc:String = viewScope.get("selLoc");
var satLoc:String = getComponent("selLoc").getValue();
这两个都不起作用-我只是得到空值

我的代码如下。我希望能得到一些帮助

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">

    <xp:button id="button15" style="font-weight:bold;font-size:8pt" value="Load Satellite Dialog">                          
        <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="dialogAddSat">
            <xp:this.action><![CDATA[#{javascript:var d = getComponent('dialogAddSat')d.show()}]]></xp:this.action>
        </xp:eventHandler>
    </xp:button>

    <xp:br></xp:br>

    <xe:dialog id="dialogAddSat" style="width:300px">
            <xe:this.title><![CDATA[#{javascript:"Make This Location A Hub"}]]></xe:this.title>
            <xe:dialogButtonBar>
                <xp:table id="tblCrd" style="width:99.0%">
                    <xp:tr>
                        <xp:td>
                            <xp:label id="label24" for="region" value="Hub Location Number" />
                        </xp:td>
                        <xp:td> 
                        <xe:djTextBox id="djTextBox2"
                            style="width:35px;text-align:right">
                            <xe:this.dojoAttributes>
                                <xp:dojoAttribute name="readOnly"
                                    value="true">
                                </xp:dojoAttribute>
                            </xe:this.dojoAttributes>
                            <xe:this.value><![CDATA[#{javascript:"0002"}]]></xe:this.value><xp:eventHandler event="onChange"
                                submit="true" refreshMode="partial" refreshId="tblCrd">
                            </xp:eventHandler>
                        </xe:djTextBox>
                        </xp:td>
                        <xp:td style="text-align:right">

                        <xp:button id="button13" value="Attach Satellite">
                            <xp:eventHandler event="onclick"
                                submit="true" refreshMode="complete" id="eventHandler7"
                                disableValidators="true">
                                <xp:this.script><![CDATA[XSP.closeDialog('#{id:dialogMakeHub}');]]></xp:this.script>
                                <xp:this.action>
                                    <xp:actionGroup>
                                        <xp:confirm>
                                    <xp:this.message><![CDATA[#{javascript:try {
    var satLoc:String = viewScope.get("selLoc");
    //var satLoc:String = getComponent("selLoc").getValue();
    var hubLoc = "0002";
    //var hubLoc:String = document1.getDocument().getItemValueString("locNum");
    return "Make Location " + satLoc + " a Satellite for Location Number " + hubLoc
} catch(e){
    return e;
}

}]]></xp:this.message>
                                        </xp:confirm>
                                        <xp:executeScript>
                                            <xp:this.script><![CDATA[#{javascript:print ("Here")}]]></xp:this.script>
                                        </xp:executeScript>
                                    </xp:actionGroup>
                                </xp:this.action>
                            </xp:eventHandler>
                        </xp:button></xp:td>
                    </xp:tr>
                    <xp:tr>
                        <xp:td>
                            <xp:label id="label25" for="region" value="Select Location..." />
                        </xp:td><xp:td>
    <xp:inputText id="selLoc" value="#{viewScope.selLoc}"></xp:inputText>
    <xe:valuePicker id="valuePicker77"
        dialogTitle="Choose A Location To Add As A Satellite"
        pickerIcon="/picker.png" for="selLoc">

        <xe:this.dataProvider>
            <xe:simpleValuePicker>
                <xe:this.valueList><![CDATA[#{javascript:import xpUtilities

var tmpLocView:NotesView = database.getView("(DbLocsOperActiveLOnly)");
var arr = new Array();
var tmpLocNum:String;
var hubLocNum:String;

//hubLocNum = padToFour(document1.getDocument().getItemValueString("locNum"));
hubLocNum = "0002;"
//arr[0] = hublocNum

var tmpLocDoc:NotesDocument = tmpLocView.getFirstDocument();
while (tmpLocDoc != null) {
    tmpLocNum = tmpLocDoc.getItemValueString("locNum");
    if (tmpLocNum != hubLocNum)
    {arr.push(tmpLocDoc.getItemValueString("locNum"));}
    var tmpdoc = tmpLocView.getNextDocument(tmpLocDoc);
    tmpLocDoc.recycle();
    tmpLocDoc = tmpdoc;
}

return arr
}]]></xe:this.valueList>
            </xe:simpleValuePicker>
        </xe:this.dataProvider>
    </xe:valuePicker></xp:td>
                        <xp:td style="text-align:right">

                        <xp:button value="Cancel" id="button10">
                            <xp:eventHandler event="onclick"
                                submit="true" refreshMode="complete" id="eventHandler4">
                                <xp:this.script><![CDATA[XSP.closeDialog('#{id:dialogAddSat}')]]></xp:this.script>
                            </xp:eventHandler>
                        </xp:button></xp:td>
                    </xp:tr>
                    <xp:tr>
                        <xp:td>
                        </xp:td>
                        <xp:td>
                        </xp:td>
                        <xp:td style="text-align:right">
                        </xp:td>
                    </xp:tr>
                </xp:table>
            </xe:dialogButtonBar>
        </xe:dialog>
</xp:view>


我找到了解决办法。我有一个行动小组,有一个确认行动。我试图在确认操作中获得值。出于某种原因,它在那里不起作用。我只是在确认操作中忽略了它,现在它工作了。

问题在于时间。在下面的代码中,计算确认文本。但这是在渲染时在服务器端计算的。渲染时,viewScope变量为空

<xp:button 
    id="button13" 
    value="Attach Satellite">
    <xp:eventHandler 
        event="onclick"
        submit="true"
        refreshMode="complete"
        id="eventHandler7"
        disableValidators="true">
        <xp:this.script><![CDATA[XSP.closeDialog('#{id:dialogMakeHub}');]]></xp:this.script>
        <xp:this.action>
            <xp:actionGroup>
                <xp:confirm>
                    <xp:this.message><![CDATA[#{javascript:try {
var satLoc:String = viewScope.get("selLoc");
//var satLoc:String = getComponent("selLoc").getValue();
var hubLoc = "0002";
//var hubLoc:String = document1.getDocument().getItemValueString("locNum");
return "Make Location " + satLoc + " a Satellite for Location Number " + hubLoc
} catch(e){
return e;
}}]]>
                    </xp:this.message>
                </xp:confirm>
                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:print ("Here")}]]></xp:this.script>
                </xp:executeScript>
            </xp:actionGroup>
        </xp:this.action>
    </xp:eventHandler>
</xp:button>

如果在输入值更改时刷新按钮组件,它将显示正确的值。但是,我更喜欢在客户端的script属性中计算确认值。关闭对话框应该是最后的操作(如果用户不确认该值,则不应关闭该对话框。这是修改后的版本

<xp:button
    id="button13"
    value="Attach Satellite">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="complete"
        id="eventHandler7"
        onComplete="XSP.closeDialog('#{id:dialogAddSat}');"
        disableValidators="true">
        <xp:this.action>
            <xp:actionGroup>
                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:print ("Here")}]]></xp:this.script>
                </xp:executeScript>
            </xp:actionGroup>
        </xp:this.action>
        <xp:this.script><![CDATA[return confirm("Location will be set "+dojo.byId('#{id:selLoc}').value+". Confirm?")]]></xp:this.script>
    </xp:eventHandler>
</xp:button>


它是否在调试工具栏的viewScope中显示?如果没有调试工具栏,请从openNTF下载。确定下载并安装在Designer中。尝试在本地使用它,但出现错误[参见上文].Serdar,这太棒了。我感觉这是关于时间的。这个解决方案非常有效-非常感谢。Serdar,如果您不介意的话,可以很快提出一个问题。我希望用户在此对话框中选择的数据段显示在基础文档中。我如何刷新基础文档上的组件?我通常将值设置为精简executeScript部分。它现在刷新所有内容:
refreshMode=complete
您可以将其更改为
partial
,并提供
refreshId
以进行部分刷新。另一种方法是在XSP.closeDialog之后调用部分刷新,如下所述:我现在明白了。我遇到的问题是我正在调用方法,这是进行保存的地方-我正在将一个字段添加到一个多值字段中,并且必须按正确的顺序添加该字段,并执行其他一些操作。我需要的是暂停(或使用回调?)因此,在脚本完成之前,操作不会继续。您知道如何操作吗?您的方法是客户端还是服务器端?对于服务器端,它会在刷新之前等待操作完成。在客户端,您可以更新值,而无需刷新值(将在下一个操作中提交)。