Xpages 从重复控件获取值

Xpages 从重复控件获取值,xpages,Xpages,我在重复控件中有一个字段。现在,我正在使用onChange事件中的viewScope捕获repeat控件内的字段值。每次字段都必须进行部分刷新,以获取范围变量中设置的值 这里的问题是,当用户在repeat控件之外设置焦点时,在字段的部分刷新完成之前不会设置焦点。有时,当用户访问远程domino服务器时,此部分刷新速度太慢。提交表单时,是否有有效的方法捕获repeat控件内的值 其思想是在用户单击add按钮时动态创建字段。当您将焦点从repeat控件内的字段移动到repeat控件外的字段时,就会出

我在重复控件中有一个字段。现在,我正在使用
onChange
事件中的
viewScope
捕获repeat控件内的字段值。每次字段都必须进行部分刷新,以获取范围变量中设置的值

这里的问题是,当用户在repeat控件之外设置焦点时,在字段的部分刷新完成之前不会设置焦点。有时,当用户访问远程domino服务器时,此部分刷新速度太慢。提交表单时,是否有有效的方法捕获repeat控件内的值

其思想是在用户单击add按钮时动态创建字段。当您将焦点从repeat控件内的字段移动到repeat控件外的字段时,就会出现问题。在重复控件内字段的部分刷新完成之前,不会设置焦点。如果服务器在您的计算机上本地运行,则可能不会出现这种情况。下面的代码显示了如何使用repeat控件动态创建字段

<xp:button value="Add Objects" id="addNavObj">
    <xp:eventHandler event="onclick" submit="true"
        refreshId="objLine" refreshMode="partial" id="eventHandler24">
        <xp:this.action><![CDATA[#{javascript:viewScope.rowItems=viewScope.rowItems+1;getComponent("navObjRep").setValue(parseInt(viewScope.rowItems));}]]></xp:this.action>
    </xp:eventHandler>
</xp:button>
<xp:repeat rows="30" var="rowData" indexVar="rowIndex"
    repeatControls="false" first="0" value="#{javascript:viewScope.rowItems}"
    id="navObjRep" style="width:800.0px">
    <xp:panel style="width:800.0px" id="objLine">
        <xp:table style="width:800.0px">
            <xp:tr>
                <xp:td style="width:245.0px">
                    <xp:inputText id="objType" style="width:130.0px">
                        <xp:typeAhead mode="full" minChars="1" ignoreCase="true"
                            id="typeAhead4" rendered="false">
                        </xp:typeAhead>
                    </xp:inputText>
                </xp:td>
                <xp:td style="width:46.0px">
                    <xp:inputText id="objCode">
                        <xp:eventHandler event="onchange" submit="true"
                            refreshMode="partial" refreshId="objCode" id="eventHandler3">
                            <xp:this.action><![CDATA[#{javascript:viewScope['objCode'+rowIndex] = getComponent("objCode").getValue()}]]></xp:this.action>
                        </xp:eventHandler>
                    </xp:inputText>
                </xp:td>
                <xp:td style="width:300.0px">
                    <xp:inputTextarea id="objDesc" style="height:40.0px;width:200.0px">
                        <xp:eventHandler event="onclick" submit="false" id="eventHandler40"></xp:eventHandler>
                        <xp:eventHandler event="onchange" submit="true"
                            refreshMode="partial" refreshId="objDesc" id="eventHandler4">
                            <xp:this.action><![CDATA[#{javascript:viewScope['objDesc'+rowIndex] = getComponent("objDesc").getValue()}]]></xp:this.action>
                        </xp:eventHandler>
                    </xp:inputTextarea>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>
</xp:repeat>

这只是一个简单的重复控件示例,具有可变数量的输入和计算字段。希望它能帮助您解决问题

    <xp:this.beforePageLoad><![CDATA[#{javascript:var languages:java.util.Vector = @Explode("de,en,pl",",");
                viewScope.put("allLanguages",languages);
                viewScope.put("selectedLanguages", languages)}]]>
    </xp:this.beforePageLoad>

<xp:checkBoxGroup id="checkBoxGroup1" value="#{viewScope.selectedLanguages}">
    <xp:this.defaultValue><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.defaultValue>
    <xp:eventHandler event="onchange" submit="true" refreshMode="complete">
         <xp:this.action><![CDATA[#{javascript:// full update //partial update}]]></xp:this.action>
    </xp:eventHandler>
    <xp:selectItems>
      <xp:this.value><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.value>
    </xp:selectItems>
</xp:checkBoxGroup>

<xp:repeat id="repeat1" rows="30" var="varcollection" repeatControls="true">
            <xp:this.value><![CDATA[#{javascript:return viewScope.get( "allLanguages" );}]]></xp:this.value>

    <xp:span>
        <xp:this.rendered><![CDATA[#{javascript:var vec:java.util.Vector = viewScope.get( "selectedLanguages" );
    return @IsMember(varcollection,vec);
    }]]></xp:this.rendered>

                <xp:label id="label1">
                    <xp:this.value><![CDATA[#{javascript:return varcollection + ": ";}]]></xp:this.value>
                </xp:label>

                <xp:inputText id="inputText1" loaded="true">
                    <xp:this.value><![CDATA[${javascript:var fieldName = "Help_" + varcollection;
    return '#{viewScope.' + fieldName + '}';}]]></xp:this.value>

                    <xp:eventHandler event="onchange" submit="true"
                        refreshMode="partial" refreshId="computedField1">
                    </xp:eventHandler></xp:inputText>
                &#160;&#160;<xp:text escape="true" id="computedField4"><xp:this.value><![CDATA[#{javascript:var fieldName = "Help_" + varcollection;
    return '#{viewScope.' + fieldName + '}';}]]></xp:this.value></xp:text>&#160;&#160;
                <xp:text escape="true" id="computedField1">
                    <xp:this.value><![CDATA[${javascript:var fieldName = "Help_" + varcollection;
    return '#{viewScope.' + fieldName + '}';
    }]]></xp:this.value>
                </xp:text>

                <xp:br></xp:br>

            </xp:span>

         </xp:repeat>    <xp:br></xp:br>
                 <xp:button value="Submit" id="button1">
                 <xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler></xp:button>
                 <xp:br></xp:br>
                 <xp:br></xp:br>
                 <xp:text escape="true" id="computedField3"><xp:this.value><![CDATA[#{javascript:return  "value1 = " +viewScope["Help_de"] + 
                    "value2 = " +viewScope["Help_en"] + 
                    "value3 = " +viewScope["Help_pl"]}]]></xp:this.value></xp:text>

    

最后一个computet字段:
ComputedField3
将获得值
'onSubmit'
,其他
onChange
不使用编辑框的onChange事件进行部分刷新-您创建了一个体验夜马。有你需要的一切。

我为同样的问题挣扎了几个小时。 我从不同的视图进行了重复构建,甚至对结果进行了一些合并,以显示每行3个字段的输入矩阵。 我想为每一行创建新的文档,重复中填充了字段

部分刷新确实是一场噩梦

最后,我使用客户端脚本
onfocus
onChange
事件将数据添加到页面上的隐藏字段中。我将每行3个字段连接起来,并将它们放在由
§
分隔的隐藏字段中

当按下提交按钮时,我只是从服务器端获取隐藏字段的值,
@Explode(§“)
它并通过新创建的数组运行并从中创建文档。

感谢您的回复。对视图范围变量的用法有了新的认识。如果repeat控件设置为true,则上述示例有效。当控件设置为false时,它将失败。在这里,我尝试使用add按钮动态添加字段,并且在提交从repeat控件内生成的字段中检索的值时失败,因为如果关闭repeat控件,则无法接收任何索引变量,我使用它绑定不同的控件(
label2
InputExt2
ComputtedField5/2
)我创建到不同的数据源
(范围变量)
。我同意stwissel maby的观点,你需要一个完全不同的解决方案来解决你的问题,因此maby可以为我们提供更多的背景。你需要后退一步:你试图实现的功能是什么?最终,解决方案与你的方法完全不同。因此,请多分享一点!只是为了说明我理解你:当你单击当你刷新整个repeat控件时,你也会在inputTextArea的onChange处理程序中这样做(为什么会这样?onChange会经常触发,除非你有一个复选框/收音机/下拉菜单,否则它会在往返中产生很多问题)。响应需要一些时间(网络、cpu),因此,一旦数据返回,它就会扰乱客户机中的焦点。-您试图实现什么用户体验?我仍然缺少这一部分。在上面的标记中,每次单击“添加对象”按钮时,都会刷新“重复”控件,以添加动态创建字段的新表行。所有字段都会设置带有部分刷新的onChange事件字段内,以捕获字段内的值并在viewScope中设置。如果用户希望为其采购订单添加新行项目或为dayBad设计完成的每个活动添加时间表,则此逻辑将有所帮助。切勿触摸文本字段的“更改时”事件。您将创建刷新噩梦