Javascript xpage getComponent始终返回null,即使在声明和初始化变量时也是如此

Javascript xpage getComponent始终返回null,即使在声明和初始化变量时也是如此,javascript,xpages,xpages-ssjs,Javascript,Xpages,Xpages Ssjs,我见过尝试绑定计算字段,但我更喜欢的解决方案;getComponent不适合我。我宁愿不要隐藏“真实”字段。这是我的。一个名为VP的计算增值税百分比字段 <xp:text escape="true" id="VP" value="#{FInvoiceDoc.VP}" style="text-align:right"> <xp:this.converter> <xp:convertNumber pattern="0.00"></xp:convertN

我见过尝试绑定计算字段,但我更喜欢的解决方案;getComponent不适合我。我宁愿不要隐藏“真实”字段。这是我的。一个名为VP的计算增值税百分比字段

<xp:text escape="true" id="VP" value="#{FInvoiceDoc.VP}" style="text-align:right">
 <xp:this.converter>
  <xp:convertNumber pattern="0.00"></xp:convertNumber>
 </xp:this.converter>
</xp:text>
tmp计算正确,VP在页面上显示正确的预期值

然后在querySaveDocument事件中,我执行以下操作

var VP = getComponent("VP").getValue();
FInvoiceDoc.replaceItemValue("VP",VP);

存储的是一个空值。我甚至通过在设置VP变量后执行“Print(VP)”命令并检查日志来确认VP变量为null。一定有我遗漏的东西。

您没有赋值,而是用一些html代码替换html表示。有了它,您只需将元素分解,并将其“转换”为一个愚蠢的div(抱歉,不知道如何更好地解释)

不要乱动前端:元素绑定到文档中的某个项目。修改该值,表示该值的元素将表示更改


并且:您不需要querysavedocument中的代码行来保存值。。。这将自动完成,这就是绑定(元素的值属性)的作用……

您不分配值,而是用一些html代码替换html表示。有了它,您只需将元素分解,并将其“转换”为一个愚蠢的div(抱歉,不知道如何更好地解释)

不要乱动前端:元素绑定到文档中的某个项目。修改该值,表示该值的元素将表示更改


并且:您不需要querysavedocument中的代码行来保存值。。。这将自动完成,这就是绑定(元素的值属性)的作用……

也许,您使用

getComponent("VP").setValue(tmp.toFixed(2));

这样行吗?我认为,您应该设置组件的值,然后….

也许,您使用

getComponent("VP").setValue(tmp.toFixed(2));

这样行吗?您应该设置组件的值,然后,我想……

在页面提交时,您不会将计算文本字段的值返回到服务器,因为它是只读的

您正在寻找一个解决方案,您可以:

  • 以读取模式显示文档的字段
  • 使用CSJS在客户端为该字段设置新值
  • 提交时将值保存回文档的字段
前两点已经在您的解决方案中起作用

第三点可以通过添加一个输入文本字段“VPdoc”来实现,该字段绑定到文档的字段“VP”并使用
style=“display:none”
隐藏


在提交时,使用提交按钮中的以下CSJS代码将当前值(innerHTML)从计算文本字段“VP”复制到输入文本字段“VPdoc”:

<xp:this.script><![CDATA[
    XSP.getElementById("#{id:VPdoc}").value = 
                                XSP.getElementById("#{id:VP}").innerHTML
]]></xp:this.script>


这样,在客户端设置为字段“VP”的值就会保存到文档中。

在页面提交时,您不会将计算文本字段的值返回到服务器,因为它是只读的

您正在寻找一个解决方案,您可以:

  • 以读取模式显示文档的字段
  • 使用CSJS在客户端为该字段设置新值
  • 提交时将值保存回文档的字段
前两点已经在您的解决方案中起作用

第三点可以通过添加一个输入文本字段“VPdoc”来实现,该字段绑定到文档的字段“VP”并使用
style=“display:none”
隐藏


在提交时,使用提交按钮中的以下CSJS代码将当前值(innerHTML)从计算文本字段“VP”复制到输入文本字段“VPdoc”:

<xp:this.script><![CDATA[
    XSP.getElementById("#{id:VPdoc}").value = 
                                XSP.getElementById("#{id:VP}").innerHTML
]]></xp:this.script>


这样,在客户端设置为字段“VP”的值就会保存到文档中。

在用户完成文档更新之前,我不想使用后端命令设置该值。在编辑过程中的后端更新会导致页面刷新,这是我真正想要避免的。他们丑得像罪一样@cjames728在后端更新它不会导致页面刷新,除非您告诉它刷新。在用户完成文档更新之前,我不想使用后端命令设置该值。在编辑过程中的后端更新会导致页面刷新,这是我真正想要避免的。他们丑得像罪一样@cjames728在后端更新它不会导致页面刷新,除非您告诉它刷新。我想这是令人沮丧的事情。可以使用客户端XSP.getElementByID(“Blah”)更新常规字段。value=BlahBlah工作正常,将更新后端文档,但对于计算字段,您必须使用XSP.getElementByID(“Blah”).innerHTML=BlahBlah,这不会更新后端。我避免在用户编辑文档期间使用后端命令,因为它们会导致非常糟糕的页面刷新。(即使是部分刷新也会让我的眼睛流血。)我喜欢住在前端,因为至少有一个调试器。(种类…)请记住,您可以限制部分刷新的目标。例如,如果组合框的
onChange
值不应影响其他组件的呈现,但您仍然希望服务器立即知道其值已更改,则组合框的
onChange
可以仅刷新该组合框。在这种情况下,一个字段的值依赖于另一个字段。因此,将事件的刷新目标设置为仅刷新一个字段。此外,如果您关心的是调试,请获取Mark Leusink的调试工具栏,该工具栏位于OpenNTF上——我想这是令人沮丧的事情。可以使用客户端XSP.getElementByID(“Blah”)更新常规字段。value=BlahBlah工作正常,将更新后端文档,但对于计算字段,您必须使用XSP.getElementByID(“Blah”).innerHTML=BlahBlah,这不会更新后端。我避免在用户编辑文档期间使用后端命令,因为它们会导致rea