XPages CSJS复合数据字段

XPages CSJS复合数据字段,xpages,composite,client-side-validation,Xpages,Composite,Client Side Validation,我的表单中有一个repeat控件和一个复合控件来处理绑定到数据源的字段。例如: <xp:comboBox id="replace" styleClass="form-control" value="#{compositeData.dataSource[compositeData.fieldName1]}"> <xp:selectItem itemLabel="Select a Code"

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

<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>
我研究了Brad在重复控件内生成动态组件id的示例,但当我使用该方法时,我在重复控件内添加行的能力中断


有人能帮我举个例子吗?

跟着蒂姆:去找数据源。按ID获取元素不能做到这一点。您可以考虑以下两种方法:

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

  • 删除repeat控件,并使用ExtLib Rest控件使数据可用。在CSJS中实现完整的UI逻辑,包括呈现单个行

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

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

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

跟踪Tim:跟踪数据源。按ID获取元素不能做到这一点。您可以考虑以下两种方法:

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

  • 删除repeat控件,并使用ExtLib Rest控件使数据可用。在CSJS中实现完整的UI逻辑,包括呈现单个行

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

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

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

非常感谢STW、Brad Balassaitis和Keith Strickland的帮助,他们帮助我思考这一点,并为我提供了各种选择

最后,我使用dojo.query获取repeat控件中动态生成的客户机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'
});
}
});

非常感谢STW、Brad Balassaitis和Keith Strickland的帮助,他们帮助我思考这个问题,并为我提供了各种选择

最后,我使用dojo.query获取repeat控件中动态生成的客户机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'
});
}
});

谢谢你,斯蒂芬。我将使用Tim的方法进行服务器端验证。最后,我使用dojo.query获取动态生成的ID,并循环使用它们来验证客户端和设置样式。请随意接受和/或向上投票-我们在这里获得分数;-)谢谢你,斯蒂芬。我将使用Tim的方法进行服务器端验证。最后,我使用dojo.query获取动态生成的ID,并循环使用它们来验证客户端和设置样式。请随意接受和/或向上投票-我们在这里获得分数;-)