【问题标题】:xpages dojo validation textbox required需要 xpages dojo 验证文本框
【发布时间】:2012-11-19 18:01:34
【问题描述】:

我的 xpage 中有 dojo 验证文本框,所需属性计算(动态计算)如下

var syn = getComponent("SynCboxGrp").getValue();
if (syn == "Yes")
{return true;
}else{
    return false;
}

这里的组件 SynCboxGrp 是单选按钮。根据单选按钮的值,文本框是必需的。但它不能正常工作。更改单选按钮值不会更改所需的行为。

感谢任何帮助


更新

感谢 stwissel、Per Henrik Lausten 和 Eric。 我在必需属性中只有这个 ssjs

<xe:djValidationTextBox id="UBOCAgent"                      value="#{dsRacDoc.UBOCAgent}"                       disableClientSideValidation="true">
<xe:this.required><![CDATA[#{javascript:var syn = getComponent("SynCboxGrp").getValue();

if (syn == "Yes")
{
    return true;
}else{
    return false;
}
}]]></xe:this.required>
</xe:djValidationTextBox>  

我还在我的单选按钮 onclick 事件 XSP.partialRefreshGet("#{id:UBOCAgent}"); 上尝试了这个部分刷新代码

这仍然不会改变行为。它基于初始单选按钮值工作。不利的一面是,因为它是一个获取请求,它会从服务器更新字段内容。我还尝试了 Eric 的建议禁用客户端验证,但没有帮助。

Eric,我也在尝试尽可能使用 CSJS,但在这种情况下,所需的属性只有 SSJS 选项。所以不知道如何尝试 CSJS。我应该尝试创建自己的 dojo 字段而不是使用 entension lib 中的一个吗?如果是这样,我不确定如何计算所需的属性。如果您可以帮助我提供一些示例代码,那将是很大的帮助。 感谢您的宝贵时间。

【问题讨论】:

  • 请提供更多代码,完整(非)工作示例。并且服务器端代码不会在客户端发生更改时执行。
  • 您是否将单选按钮设置为对文本框进行部分刷新(以便重新计算所需的属性)?正如 Stephan 所写,请添加更多代码,以便更轻松地回答您的问题
  • 感谢 stwissel,Per Henrik Lausten。

标签: xpages xpages-extlib


【解决方案1】:

您正在执行 partialRefreshGet,它正在更新 Dojo 验证文本框。但是您永远不会从单选回传更新的值,因此单选按钮的服务器端值仍然是初始值。因此,required 仍然是 false。

当 Dojo 验证文本框上的 required 为真时检查标记,但验证会触发客户端,因此标记中应该有一个属性,您可以通过 CSJS 操作,如果这是您的首选路线。

您是否有需要解决的特定延迟问题?解决这个问题和其他关于单击按钮查找数据库的问题时,您遇到了一些问题。我不知道您在 XPages 开发方面的经验如何,但如果对客户端输出和服务器端组件树没有很好的理解,我不会推荐这种方法。由于传递给浏览器的 CSJS 的数量,XPage 的初始页面加载也会更慢,并且传递给浏览器的 HTML 的大小会更大。

我建议使用内置的部分刷新,除非浏览器到服务器网络是一个重大问题,然后才回退到编写自己的部分刷新来发布数据子集。根据我的经验,它的开发更容易、更快捷、更容易调试且更灵活。

对于这种特殊情况,无论您是自己编写部分刷新代码还是使用内置功能,我都不确定这一点。一旦您在 Dojo 验证文本框上设置了验证,该验证就会在客户端运行,并且可能会影响通过发布到服务器来取消设置所需属性的任何尝试。我没有测试,所以不能确定。

【讨论】:

    【解决方案2】:

    两件事之一:

    1. 如前所述,要触发您的 SSJS 值更改,请确保部分(至少)刷新包含上述代码的元素;可以使用容器元素来完成。此外,请检查您的字段的 disableClientSideValidation 参数是否已设置(所有属性视图)。
    2. 将您的 SSJS 代码(仅返回是或其他情况的二进制评估,我假设否,值)转换为 CSJS

    最近,在我当前项目的初步开发之后,我开始偏爱 CSJS 方法,以减少服务器端的回调;尤其是在我想要实现的所有组件的显示/渲染的情况下。如果你走这条路,请记住 dojo.byId("#{id:myControlsServerNameHere}").value (对于文本字段,请参阅下面的单选按钮值)结合设置 displayvisible CSS属性可以很方便。正如文档所述,如果您希望它存在于页面上但不显示(出于格式化目的,也可以保留默认值),请使用可见性路线,否则显示属性。

    我目前使用的单选值的 CSJS 抓取如下:

    var result=null;
    for(i=0; i<document.forms[0].elements.length;i++){
        if(document.forms[0].elements[i].name=="#{id:serverNameOfRadioElement}"){
            if(document.forms[0].elements[i].checked == true){
                result=document.forms[0].elements[i].value;
                break;
            }
        }
    }
    //then handle your result, either with an if, or switch statement
    

    希望这会有所帮助。如果还有更多问题,请发回更多代码以提供更大的图景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      相关资源
      最近更新 更多