XPages CSJS 复合数据字段

XPages CSJS compositeData fields

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

<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 中的重复(由于 RPC 调用)中保存 rowCount,所以我希望能够验证 CSJS 中重复的每一行。我如何获得该领域的句柄?我知道 Tim Tripcony 曾经建议直接访问数据源。由于我示例中的 id "comboBox1" 位于重复控件中并用于每一行,因此我不确定是否应该使用它来获取值。在我看来,由于该字段绑定到 replace01、replace02 ...,我应该尝试获取 replace01 的值,对吗?

我也不能使用以下内容,因为组合框字段的 ID 不是动态计算的。

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

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

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

谁能帮忙举个例子?

关注蒂姆:追踪数据源。按 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 字段。将其输入您的验证函数

非常感谢 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'
});
}
});