0

我在重复控件中有一个字段。现在正在使用事件viewScope中的aonChange来捕获重复控件内的字段值。每次字段都必须部分刷新才能获得范围变量中设置的值。

这里的问题是当用户在重复控件之外设置焦点时,直到字段的部分刷新完成后才设置焦点。有时,当用户访问远程 domino 服务器时,这种部分刷新太慢了。提交表单时是否有有效的方法来捕获重复控件中的值?

这个想法是在用户单击添加按钮时动态创建字段。当您将焦点从重复控件内部的字段移动到重复控件外部的字段时,就会出现问题。没有设置焦点,直到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>
4

3 回答 3

0

不要使用编辑框的 onChange 事件进行部分刷新——你会创造一个体验噩梦。练习 23有你需要的一切。

于 2013-05-07T04:58:18.440 回答
0

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

    <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 字段:computetdField3将获取值'onSubmit'和其他字段onChange

于 2013-05-06T07:23:21.457 回答
0

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

部分刷新确实是一场噩梦。

最后,我最终使用客户端脚本onfocusonChange事件将我的数据添加到页面上的隐藏字段中。我将每行的 3 个字段连接起来,并将它们放在由 a 分隔的隐藏字段中§
当按下提交按钮时,我只是获取服务器端该隐藏字段的值,@Explode("§")它并通过新创建的数组运行并从中创建文档。

于 2014-06-18T08:03:23.750 回答