2015-08-14 48 views
3

我在我的項目上使用Valdr,我需要驗證日期輸入「startDate」在另一個日期輸入「endDate」之前。有沒有比較Valdr日期的方法?

<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自定義驗證其他領域。

回答

1

答案很簡短但不滿意:valdr目前不支持這一點。雖然GitHub上有一個open feature request

0

直到功能在valdr中實現,您可以使用自己的驗證器指令和使其與valdr對話。該指令可能需要一個「表單」,並可以獲取要比較的日期模型的名稱。然後你做你的邏輯來比較這兩個值,並設置適當的'ngModelController'的有效性。由於您需要在爲該模型設置有效性時提供錯誤,因此錯誤名稱將與您的valdr連接。

之後,你只需只需將錯誤映射在 'valdrMessage' 服務:

.run(function (valdrMessage) { 

valdrMessage.angularMessagesEnabled = true; 

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

});

Valdr會照常顯示無效字段的消息。

0

實際上,您可以通過自定義驗證程序來解決此問題,該驗證程序可以獲取另一個字段並相互比較這些值。下面的代碼使用valdr-bean驗證來生成valodation.json。

如果您不想使用它,只需查看JS代碼並手動在您的validation.json中添加驗證器即可。

的Java註釋(該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'); 
}]); 
0

你可以用這個解決方案去:

  1. 在任何日期字段的在變化計算出一個布爾值 - 指示值,如果驗證規則滿足
  2. 創建一個簡單的自定義驗證程序檢查該值是不是真的
  3. 註冊您的驗證,並添加約束爲計算值
  4. 地點爲計算值的隱藏輸入任何你喜歡你的驗證消息出現