有没有办法比较Valdr的日期?

时间:2015-08-14 21:35:17

标签: angularjs valdr

我在我的项目中使用Valdr,我需要验证日期输入“startDate”是否在另一个日期输入“endDate”之前。

<input id="startDate" name="startDate" type="text" ng-model="project.startDate"/>
<input id="endDate" name="endDate" type="text" ng-model="project.endDate"/>

我知道,如果没有Valdr,可以使用自定义指令解决此问题,如下所示:Directive for comparing two dates

我发现有点不清楚如何在Valdr上创建使用其他字段值的自定义验证器。

4 个答案:

答案 0 :(得分:1)

答案很短但不满意:valdr目前不支持这一点。但是GitHub上有一个open feature request

答案 1 :(得分:0)

在valdr中实现该功能之前,您可以使用自己的验证器指令,并使其与valdr进行通信。该指令可能需要一个&#39;形式&#39;并且可以获取要比较的日期模型的名称。然后你做你的逻辑来比较这两个值,并设置适当的&#ng; ngModelController&#39;的有效性。由于在为该模型设置有效性时需要提供错误,因此错误名称将是您与valdr的连接。

之后,您只需要在&#39; valdrMessage&#39;中映射错误。服务:

.run(function (valdrMessage) {

valdrMessage.angularMessagesEnabled = true;

valdrMessage.addMessages({
  'date': 'Invalid date!'
});

});

Valdr将照常显示无效字段旁边的消息。

答案 2 :(得分:0)

实际上,您可以通过自定义验证器解决此问题,该验证器可以获取另一个字段并将值相互比较。下面的代码使用valdr-bean-validation来生成valodation.json的服务器端。

如果你想在没有它的情况下使用它,只需查看JS代码并手动在validation.json中添加验证器。

Java Annotation(valdr验证器的服务器端声明):

package validation;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR,
        ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
public @interface DateFormat {

    String message();

    Class[] groups() default { };

    String beforeFieldName();
}

Java Bean(使用注释,此类必须用于生成validation.json):

package pojo;

import validation.DateFormat;

public class RegistrationPojo implements BasePojo {

    @NotNull(message = "message.date1.required")
    private Date date1;

    @NotNull(message = "message.date2.required")
    @DateFormat(message = "message.date2.date", beforeFieldName = "date1")
    private Date date2;

}

JS(自定义验证器的实现并在valdr中注册):

module.factory('validation.DateFormat', [
    function () {
    return {
        name: 'validation.DateFormat',
        validate: function (value, constraint) {
            var minOk = true;
            var maxOk = true;
            var format = false; // constraint.pattern is mandatory
            //do not validate for required here, if date is null, date will return true (valid)

            console.log("my date validator called");
            console.log("    beforeFieldName: " + constraint.beforeFieldName);

            var field = document.querySelector('[name="' + constraint.beforeFieldName + '"]');
            console.log("field value: " + (field ? field.value : "null"));
            return (!field || value > field.value);
        }
    };
}]);

module.config([
    "valdrProvider", 
function(valdrProvider) {
    valdrProvider.addValidator('validation.DateFormat');
}]);

答案 3 :(得分:0)

你可以选择这个解决方案:

  1. 根据任何日期字段的变化计算bool值 - 表示是否符合验证规则的值
  2. 创建一个简单的自定义验证程序,以检查该值是否为真
  3. 注册验证程序并为该计算值添加约束
  4. 在您希望显示验证消息的任何位置放置该计算值的隐藏输入