【问题标题】:The way of accessing and setting server-side variable with client-side使用客户端访问和设置服务器端变量的方式
【发布时间】:2018-01-22 12:46:25
【问题描述】:

我有一个使用客户端验证的 XPage。如果验证失败,它会给用户一个alert 消息,并且不允许处理服务器端的东西。我遇到的问题是无法用客户端“分配”服务器端变量。例如,假设我有一个这样的 xp 输入字段:

<xp:inputText 
  styleClass="doc_field_textinput" id="input_part_title" type="text" size="40" 
  disableClientSideValidation="true" >
</xp:inputText>

我使用一个按钮来验证,如果验证成功 - 保存:

<xp:button id="save_part_btn" value="+Add this" style="float:right;">
             <xp:eventHandler event="onclick" submit="true"
                refreshMode="complete">
                <xp:this.action><![CDATA[#{javascript:

                    var estdoc:NotesDocument=database.getDocumentByUNID(doc_source.getDocument().getParentDocumentUNID())
                    var estPartdoc:NotesDocument=estdoc.getParentDatabase().createDocument()

                    estPartdoc.replaceItemValue('Form','Estimate_Cost_Part')
                    estPartdoc.replaceItemValue('Predoc',estdoc.getUniversalID())
                    estPartdoc.replaceItemValue('$OSN_IsSaved','1')

                    estPartdoc.replaceItemValue('Title', getComponent('input_part_title').getValue())

                    }]]>
            </xp:this.action>
                <xp:this.script><![CDATA[ 
                var result = "";
                var wholeResult = true;

                function isStringEmpty(string2Check) 
                {
                    return string2Check == "" || string2Check[0] == " ";
                }

                if(isStringEmpty(document.getElementById("#{id:input_part_title}").value)) 
                {
                    wholeResult = false;
                    result += 'The field cannot be empty!'
                }

                result = result.replace(/\n$/, "")

                if(!wholeResult) 
                {
                    alert(result)
                }

                return wholeResult;

                ]]>
                </xp:this.script>
             </xp:eventHandler>
</xp:button>

不幸的是,服务器端上的input_part_title总是null, 在任何情况下,document.getElementById("#{id:input_part_title}").value 工作得非常好,并且确实按照预期的方式工作。我希望我可以将同一行代码添加到我的服务器端,但我不能,因为document 是服务器端的未知属性。有什么方法可以以某种方式将input_part_title 分配给客户端的值吗?

【问题讨论】:

  • 您是否尝试过 getSubmittedValue 而不是 getValue
  • 是的,试过了,不行

标签: javascript validation xpages ssjs


【解决方案1】:

最佳实践是使用组件的value 属性将其绑定到某个服务器端元素,例如dominoDocument 数据源上的字段或viewScope 变量。然后就可以参考了。

另一种方法是使用getComponent("input_part_title").getValue()

将验证器附加到组件将确保在服务器上的流程验证阶段进行验证。如果您有非文本输入组件(例如取一个数字),该阶段也会运行转换器检查并相应地中止。这将中止处理,因此按钮的 eventHandler 的 action 属性中的代码根本不会运行。它还将处理将错误消息返回到浏览器(以编程方式,您需要查看facesContext.addMessage() 以及将组件突出显示为无效(getComponent.setValid(false))。验证器会为您处理所有这些。

【讨论】:

  • 是的,我明白了,使用viewScope 似乎可以解决问题。所以我添加到 xp:inputText 值属性中,像这样value="{viewScope.part_title}" 我以后如何在客户端访问和更改input_part_title 属性?
  • 客户端,您需要在标准的 JavaScript 处理 HTML 表单时访问 HTML 组件。在服务器端,将其绑定到dominoDocumentviewScope 变量允许您从数据源(基本上是XPage 范围内的Java 对象)进行访问。这避免了迭代组件树,这对性能来说代价高昂,并且只能获取具有该名称的最接近的组件 - 在自定义控件和重复控件的情况下,可以多次使用相同的 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多