2013-05-06 66 views
0

我在重复控制中有一个字段。现在,我在onChange事件中使用viewScope来捕获重复控件中的字段值。每次该字段必须进行部分刷新才能获取范围变量中设置的值。从重复控制获取值

这里的问题是,当用户设置重复控制之外的焦点,焦点不设置,直到场的局部刷新完成。有时候,当用户访问远程多米诺服务器时,局部刷新速度太慢。提交表单时,是否有一种有效的方法来捕获重复控制中的值?

这个想法是当用户点击添加按钮时动态创建字段。将焦点从重复控制内的区域移动到重复控制区域外时,会出现问题。直到重复控制内的字段部分刷新完成,焦点才会被设置。如果服务器在您的机器上本地运行,则可能不会发生这种情况。下面的代码显示了重复控制的使用,以创建字段动态

<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> 
+0

您需要退一步:您尝试实现的功能是什么?最终,解决方案与您的方法完全不同。所以多分享一点! – stwissel 2013-05-06 10:44:02

+0

只是为了清楚我明白你:当你点击按钮刷新整个重复控制,你也可以在onTextArea的onChange处理程序中执行此操作(为什么那个?OnChange会很频繁地触发,除非你有复选框/收音机/下拉菜单它往往会在往返中造成很多问题)。响应需要一些时间(网络,CPU),所以一旦数据回来,它就会扰乱客户端的焦点。 - 你想要达到什么用户体验?我仍然缺少那部分。 – stwissel 2013-05-06 22:48:54

+0

在上面的标记中,每次单击添加对象按钮时,刷新重复控件以添加具有动态创建字段的新表格行。具有部分刷新的onChange事件被设置为内部的所有字段以捕获字段内的值并在viewScope中设置。如果用户想要为他们的购买订单添加新的行项目或为每个活动添加时间表那天 – shibu 2013-05-07 03:56:37

回答

0

不要使用一个编辑框的onChange事件的局部刷新 - 你创造一种体验恶梦。 Excercise 23有你需要的。

0

它只是一个简单的,例如与输入的可变数量的重复控制和计算Fields.Hope它可以帮助你解决你的问题。

<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

+0

感谢您的答复。对视图范围变量的使用有了新的想法。如果重复控制设置为true,上面的例子就可以工作。当控件设置为false时,它失败。在这里我试图添加字段动态使用添加按钮,同时提交的值从重复控制 – shibu 2013-05-06 09:31:22

+0

里面生成的字段中检索它失败,因为如果你关闭重复控制你不能recive任何索引变种,控件('label2','inputText2'和'comptutedField5/2')我创建到不同的数据源'(ScopeVariables)'。我同意stwissel maby你需要一个完全的解决方案来解决你的问题,所以maby给了我们更多的背景。 – 2013-05-06 11:31:04

0

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

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

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