Xpages如何在日期为空时签入javascript?

Xpages如何在日期为空时签入javascript?,javascript,xpages,Javascript,Xpages,这真的很奇怪。我正在js库中进行验证。我检查字段是否为空,如果为空则抛出错误 我有一个要检查的日期字段。如果我没有输入默认值,代码工作正常。它说日期是空的,然后当我输入一个值时,它就会让它通过。但是,如果我将默认值设置为@Now或@Today,如果用户碰巧删除了日期,它将不会发现错误。我知道这并不是真的必要——我可以设置一个必需的验证器,但我无法弄明白这一点,这让我抓狂 //This SSJS script library consolidates all the validation

这真的很奇怪。我正在js库中进行验证。我检查字段是否为空,如果为空则抛出错误

我有一个要检查的日期字段。如果我没有输入默认值,代码工作正常。它说日期是空的,然后当我输入一个值时,它就会让它通过。但是,如果我将默认值设置为@Now或@Today,如果用户碰巧删除了日期,它将不会发现错误。我知道这并不是真的必要——我可以设置一个必需的验证器,但我无法弄明白这一点,这让我抓狂

    //This SSJS script library consolidates all the validation in one place
    //The postValidationError() function flags a control as invalid and provides an error message
    //so that the XPages ErrorMessage control is used to display the error on the page.

    var validateForm = function(){
        var valid = true;
        var control;
        var val;


        // ***  REPEAT THE FOLLOWING BLOCK OF CODE FOR EACH CONTROL FOR BASIC "REQUIRED" VALIDATION

        // For each field, change the Control Name in getComponent() and the error message text in postValidationError()
        //   Optionally, modify the IF conditions with more complex JavaScript for value ranges, regular expressions, data lookups, etc.


        //Validate Location
        control = getComponent("loc");
        val = control.getValue();
        if (isEmpty(val)) {
            valid = false;
            postValidationError(control,"Please enter a Loc");
        }


        //Validate Work Category
        control = getComponent("workCategory");
        val = control.getValue();
        if (isEmpty(val)) {
            valid = false;
            postValidationError(control,"Please enter a Work Category");
        }

        //Validate Work Sub Category
        control = getComponent("workSubCategory");
        val = control.getValue();
        if (isEmpty(val)) {
            valid = false;
            postValidationError(control,"Please enter a Sub Work Category");
        }


        //Validate Date


        control = getComponent("date");
        val = control.getValue();
        if (isEmpty(val)) {
            valid = false;
            postValidationError(control,"Please enter a date");
        }
        //Validate Time Spent
        control = getComponent("timeSpent");
        val = control.getValue();
        if (isEmpty(val)) {
            valid = false;
            postValidationError(control,"Please enter Time Spent");
        }

        // *** ----------------------------------------------------------------   *** 

        return valid;
    }

    function postValidationError(control, msg) {
        if ((typeof msg) != "string")
            return;
        var msgObj = new javax.faces.application.FacesMessage(javax.faces.application.FacesMessage.SEVERITY_ERROR, msg, msg);
        facesContext.addMessage(control.getClientId(facesContext), msgObj);
        control.setValid(false);
    }

    function isEmpty(o){


        return (o == null || o == "") ? true: false;

        //return (o == null || @Trim($A(o)[0]) == "" ) ? true : false;
    }

    function $A( object ){
        try {
            if( typeof object === 'undefined' || object === null ){ return []; }
            if( typeof object === 'string' ){ return [ object ]; }
            if( typeof object.toArray !== 'undefined' ){return object.toArray();}
            if( object.constructor === Array ){ return object; }  
            return [ object ];
        } catch( e ) {  }
    }

Bryan,XPages中推荐的验证方法是使用验证器,您编写的代码要少得多,您可以有选择地控制何时验证字段,您可以将不同的检查彼此分开

检查我的电脑。简言之:

  • 代码验证(按钮、提交事件等)是完成验证的典型方式。流行的方式并不意味着它是正确的。您需要使用自己的通知机制(如更新标签),并将验证绑定到UI中。此外,删除字段时,验证例程可能会中断。最后并非最不重要的一点:您很难记录哪些内容得到了验证,以及验证的原因。(你知道我要说什么了)
  • 验证器与字段一起定义,并打开一系列可能性
  • 您可以编写JavaScript、正则表达式、检查数据类型,或者自己编写。您可以在按钮/事件代码中执行的所有操作都可以在验证器中执行。由于验证器本身不与UI交互,因此设计者可以决定如何在不更改验证代码的情况下显示消息。当您删除一个字段时,它的所有验证代码都会随之删除,因此维护变得更加容易。最后并非最不重要的一点:您可以针对XPages源运行XSLT报告,并呈现一个报告,该报告显示了一个包含所有已定义验证程序的字段,这使得文档编制更加容易
  • 表单验证是在经典Notes表单中定义的@公式。它们仅在您将“运行表单验证”指定为“保存时”或“两者”时触发。通常,您在升级现有应用程序时会使用它们

您可能会发现一些有用的信息。有些信息可能会对您有所帮助:“使用SSJS获取值需要提交数据。如果数据尚未更新/提交到服务器,这些代码段将返回“null”,因此,对于默认值,您似乎应该使用
control.getSubmittedValue
。对于具有默认值的日期字段,我发现了同样的问题。如果字段为空并且表单已提交,则在验证开始之前,该字段将填充默认值。我可能错过了什么。我有一个带有2个控件的Xpage,一个条目cc,下面是数据的视图控件。我在顶部输入表单的字段上使用了验证器。一切都很好。然后,我将sort添加到xpage底部cc的视图jn中的列中。但是,当我单击排序字段时,不会发生任何事情,因为验证在顶部的cc中触发,并且验证失败。我只希望在用户单击submit按钮时进行验证。排序字段确实有点麻烦。最简单:在“保存”按钮中添加requestScope.validateThis=true,并在所需属性中将其计算为requestScope.validateThis。所以你只在按下按钮时运行这个公式。通常情况下是另一种方式(有选择地关闭验证),但这对sortOK来说是没有意义的。但是,我有两个字段是dojoFilteringSelect,它们没有必需的属性。所以我不认为在使用这些类型的字段时可以使用这种方法。DojoFilteringSelect非常适合提前输入用户类型,可以快速输入数据。请查看“所有属性”面板。您应该能够在那里添加验证器