需要xpages dojo验证文本框

时间:2012-11-15 01:12:19

标签: xpages xpages-extlib

我的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中的一个吗?如果是这样,我不知道如何计算所需的属性。如果你能帮我提供一些非常有帮助的示例代码。 谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

您正在执行partialRefreshGet,它正在更新Dojo验证文本框。但是你永远不会从收音机回发更新的值,因此单选按钮的服务器端值仍然是初始值。因此,要求仍然是错误的。

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

您是否遇到需要解决的特定延迟问题?通过点击按钮来解决这个问题以及另一个关于对数据库进行查找的问题,你会遇到一些问题。我不知道你在XPages开发方面有多么有经验,但如果没有很好地理解客户端输出和服务器端组件树,这不是我推荐的方法。由于传递给浏览器的CSJS数量较多,XPage的初始页面加载速度也会变慢,传递给浏览器的HTML大小会更大。

我建议使用内置的部分刷新,除了浏览器到服务器网络是一个重要问题,然后再回到编码自己的部分刷新发布数据子集的情况。根据我的经验,开发更容易,更快捷,更容易调试,更灵活。

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

答案 1 :(得分:0)

两件事之一:

  1. 如前所述,要触发您的SSJS值更改,请确保部分(至少)刷新包含上述代码的元素;可以使用容器元素完成。另外,检查是否设置了字段的disableClientSideValidation参数(所有属性视图)。
  2. 将您的SSJS代码(仅返回是或否则的二进制评估,我假设为否,值)转换为CSJS
  3. 最近,在我当前项目的初步开发之后,我开始偏爱CSJS方法,以减少服务器端回调;尤其是在组件的显示/渲染是我试图实现的所有情况下。如果你走这条路,请记住dojo.byId(&#34;#{id:myControlsServerNameHere}&#34;)。value(对于文本字段,请参阅下面的抓取单选按钮值)并设置{{ 3}}或display 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
    

    希望这会有所帮助。如果您遇到更多问题,请回复更多代码,以便了解更多信息。