xpages - 部分刷新 - 根据输入的字符数隐藏按钮

xpages - partial refresh - hide button based upon number of characters entered

在我的 xpages 应用程序中,我想根据在字段 (xp:inputText) 中输入的字符数量来控制提交按钮的可见性(或禁用 [​​=18=])。

我已经实现了部分刷新的 xsnippet https://openntf.org/XSnippets.nsf/snippet.xsp?id=standby-dialog-custom-control 但是如果我计算输入文本控件中的值的长度,刷新对话框出现每个键事件。

我怎样才能避免这种情况?我可以暂时避免出现待机对话框还是应该在客户端使用 javascript?

这可以通过客户端脚本来完成。无需一直提交数据

XSP.getElementById('id').hidden=true;

如果您确实需要使用客户端-服务器往返计算每个键事件的输入文本控件中值的长度(例如,如果您要确保没有人会破解您的客户端 JS),并且假设您使用上述 XSnippet 并且不希望在每次按键时都出现待机对话框,这里您通常需要做的是:

  • 当你做XSP.partialRefreshPost时,你可以传递options对象作为最后一个函数参数。只需向该对象再添加一个 属性(如果您已经将内容放入其中)或使用单个 属性 创建新对象,它必须类似于

    XSP.partialRefreshPost('#{id:yourId}', {dontShowDialog: true})
    
  • 这个 options 对象一直传递到第 39 行,partialrefresh-start 事件在此处发布并将该对象公开为最后一个元素
  • 第 137 行订阅了此事件。在它声明的函数中多加一个参数,比如

    dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options)
    

    现在您可以在函数体

  • 中读取您的options
  • 有点包装下两行,根据您的 options 参数使用条件语句创建对话框。整个事情看起来像这样:

    dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options) {
        if (options) {
            if (options.dontShowDialog) return;
        }
        StandbyDialog_Do = true;
        StandbyDialog_Started();
    });
    

以上所有内容都是针对使用客户端事件处理程序的情况(submit 属性 设置为 false 的情况。如果使用服务器端处理程序,事情变得有点复杂,因为你不能将任何额外的自定义属性传递给最终调用的 _partialRefresh 方法。但是,我可以想到一种方法来处理这个问题:

  • 在调用_partialRefresh方法之前,CSJS引擎会做一些准备工作,其中之一就是为页面上的一些隐藏输入字段设置特定的值。这里我们对 $$xspsubmitid 字段感兴趣,该字段被赋予您声明的事件处理程序客户端 ID 的值。然后你可以在你的劫持者 XSnippet 中读取 $$xxpsubmitid 字段的值,如果它包含你的事件处理程序的 ID - 不要显示待机对话框。这种方式不太灵活,但应该可行

P.S。我自己还没有尝试过上面写的所有内容,但如果你尝试失败了,我很乐意调查并修复。