XPages CSJS compositeData字段

时间:2016-02-16 20:06:50

标签: xpages composite client-side-validation

我的表单中有一个带有复合控件的重复控件来处理绑定到数据源的字段。例如:

<xp:comboBox id="replace"
            styleClass="form-control"
            value="#{compositeData.dataSource[compositeData.fieldName1]}">
            <xp:selectItem itemLabel="Select a Code"
                itemValue="Select a Code">
            </xp:selectItem>
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:var db = sessionScope.serverPath + "!!" + sessionScope.dbName;
var companyCode = @Trim(@Unique(@DbLookup(db,"vwTblCompany", company,2)));
return @Trim(@Unique(@DbLookup(db,"vwTables","Replacement",3)));
                    }]]></xp:this.value>
            </xp:selectItems>
</xp:comboBox>

字段绑定如下:

<xp:repeat indexVar="rownum" first="1"
rows="#{javascript:viewScope.rowCount }" var="data"
value="#{javascript:viewScope.rowCount + 1}">
<xc:cc_dynamicAssetItems
row="#{(rownum lt 10)? '0':''}#{rownum}"
dataSource="#{document1}"
fieldName1="replace#{(rownum lt 10)? '0':''}#{rownum}"
fieldName2="item#{(rownum lt 10)? '0':''}#{rownum}"
fieldName3="class#{(rownum lt 10)? '0':''}#{rownum}"
fieldName4="cur#{(rownum lt 10)? '0':''}#{rownum}"
fieldName5="costEst#{(rownum lt 10)? '0':''}#{rownum}"
fieldName6="costEstUS#{(rownum lt 10)? '0':''}#{rownum}"
fieldName7="life#{(rownum lt 10)? '0':''}#{rownum}">
</xc:cc_dynamicAssetItems>
</xp:repeat>

由于我有一个viewScope变量的句柄,该变量在CSJS中的repeat(感谢RPC调用)中保存rowCount,所以我希望能够验证CSJS中重复的每一行。如何获得该领域的处理?我知道Tim Tripcony曾经建议直接进入数据源。自id&#34; comboBox1&#34;在我的例子中是重复控制并用于每一行,我不确定我应该使用它来获取值。在我看来,因为该字段必然会替换01,替换02 ...,我应该尝试获取replace01的值,对吧?

我无法使用以下内容,因为组合框字段的id不是动态计算的。

var val = XSP.getElementById("replace01").value

我查看了Brad在重复控件中生成动态组件ID的示例,但是当我使用该方法时,我能够在重复控件中添加行。

http://xcellerant.net/2013/07/29/access-repeat-components-from-outside/

有人可以帮忙举个例子吗?

2 个答案:

答案 0 :(得分:0)

关注Tim:追踪数据源。按ID获取元素不会这样做。您可以考虑两种方法:

  • 在服务器端验证您的数据源,并使用错误控件显示结果。这遵循了这样的想法:验证验证数据,而不是UI交互

  • 删除重复控件并使用ExtLib Rest控件使数据可用。在CSJS中实现完整的UI逻辑,包括渲染各行。

介于两者之间的任何东西都可能变得混乱。但是如果你必须:你总是可以在repeat中生成一个脚本调用,它将生成的迭代的id作为参数。在脚本标记中,只需计算如下内容:

   Return 'var x = {"'+getId('replace01')+'","'+getId('anotherfield')+'"};
   mastervalid.push(x);'

(将getId替换为为您提供呈现ID的SSJS函数)。 Mastervalid将是在重复之外的CSJS中定义的数组。最终得到一个数组,其中包含JS对象中的所有客户端Id字段。将其输入验证功能

答案 1 :(得分:0)

非常感谢STW,Brad Balassaitis和Keith Strickland的帮助,帮助我思考并给予我各种选择。

我最终使用dojo.query来获取重复控件中动态生成的客户端ID的句柄,然后使用foreach来验证每个节点。

//validate Replacement Code
dojo.query('[id$="replace"]').forEach(function(node, index) { 
 //alert(index + ': ' + node.value);
 if(node.value == "Select a Code"){
 dojo.style(node, {
 border: 'red solid 1px'
});
}
});