我在我的项目中使用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上创建使用其他字段值的自定义验证器。
答案 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)
你可以选择这个解决方案: