【问题标题】:Getting a field value from a custom control when there are multiple instances of the custom control当自定义控件有多个实例时从自定义控件获取字段值
【发布时间】:2026-01-26 22:10:01
【问题描述】:

我有一个包含同一个自定义控件的多个实例的 xPage。如何从 xPage 上的按钮获取特定自定义控件上的字段值。

通常我会这样做:

ctlName = "radioGroupCMBUAction"; var changeType = getComponent(ctlName).getValue();

如果控件只有一个实例。我将如何使用控件的多个实例来执行此操作?

【问题讨论】:

  • Bruce,您能否添加一些示例代码,以便我们了解您如何为各个自定义控件分配 ID?
  • Per,这是我的问题。能够为每个具有唯一 ID 的控件分配唯一 ID。人们在这里帮助我绑定*.com/questions/9913331/dynamic-data-binding。但我宁愿不动态创建 ID。我不敢相信这很难做到。您可能会认为我可以只引用自定义控件 ID 来访问各个控件。

标签: xpages


【解决方案1】:

如果没有代码,我不确定 .getValue() 是否会起作用,因为为了实现这一点,它必须拉出一个字段,因为自定义控件可能在其中重复等。

假设如果每个 customControl 实例都有一个彼此唯一的 id,它应该可以正常工作,因为每个实例都应该有自己的变量。

但是,其他想法可能是传入一个字符串,并将此字符串用作自定义控件内的范围变量的名称,该变量可以从任何地方拉出。我之前在自定义控件上为字符串创建属性并在自定义控件内部使用

viewScope[compositeData.customProperty] = value.

然后在自定义控件的上下文之外,我知道我传入的字符串,因此我可以将这个值拉回。传入它意味着多个实例不会互相覆盖。

或者,您可以将自定义控件中的字段写入文档,以便将其取出或作为保存问题的最终解决方案。

【讨论】:

  • 如何给每个控件一个唯一的ID?可以计算 id 吗?我确实注意到该控件似乎有一个带有与之关联的 cc 名称的 id。示例 MyCC1:MyField1。我尝试在 getComponent 中使用它,但它不起作用。我真的很想去现场,因为如果我让它工作,如果验证失败,我希望能够去现场。
  • 如果您为控件定义 ID,这将始终转换为由 xpages 环境生成的唯一 ID。 (类似于 view:controlid:fieldid)
  • 是的,正如 jjtbsomhorst 所说,您不必创建完整的唯一 ID。在控件上只需添加一个 id 属性,XPages 将添加其余部分。例如。 然后这将变成类似 view:panel_34:control:sample 你可以通过调用 getComponent("sample");如果您需要与该字段进行交互,我的第一个想法可能是更多的此代码应该在自定义控件内部,否则我会使用范围变量执行我提到的操作并保存该字段的 id,以便您可以做 getComponent(viewScope["control1"]) 等。
  • 或者如果你给自定义控件中的每个控件一个 id,你可以通过获取自定义控件 id 并将其添加到字段中来计算字段的 id,例如 customControlId+"mainDiv:secondDiv:quanityField"等等,但这可能非常混乱,通常自定义控件最好在自包含时进行,尝试在其中放置验证以及您需要进行的任何其他操作,以便可以将其放在页面上并指向多米诺文档字段或其他内容这样,会容易很多
【解决方案2】:

不确定这是否可以帮助您..?不久前,我写了一篇关于“私有”作用域变量的提示:

http://dontpanic82.blogspot.com/2010/03/xpages-tip-regarding-private-scoped.html

【讨论】:

  • 是的,谢谢,我意识到我可以使用范围变量。我想要做的是控制本身,这样我就可以设置焦点(如果我能正常工作的话)。