AngularJS - 用于验证表单的信用卡到期日期格式

时间:2014-06-04 21:58:44

标签: javascript angularjs validation date

我正在学习AngularJS,我正在制作信用卡验证器。 我已经在自定义过滤器中实现了Luhn算法,它完美地运行。但是,为了验证表格,我也希望到期日期有效,即满足以下条件: - 08/16 - 2015年2月 - 0518 - 日期不得过期(显然)

因为我发现Angular中已有日期过滤器,所以我尝试创建一个。对我而言似乎合乎逻辑,但它根本不起作用。这是代码:

/**
* validate-expiry-date Module
*
* Validates the date format and that the date is not in the past
*/
angular.module('validate-expiry-date', []).filter('validDate', [function () {
  return function (date) {

    var actualDate = new Date();
    var m,y,d;

    if (/^\d{2}\/\d{2}$/.test(date)) {
        m = date.substring(0, 2);
        y = 20 + date.slice(-2);
        d = new Date(y,m);
        return(actualDate > d);
    }if (/^\d{2}\/\d{4}$/.test(date)) {
        m = date.substring(0, 2);
        y = date.slice(-4);
        d = new Date(y,m);
        return(actualDate > d);
    }else if (/^\d{4}$/.test(date)) {
        m = date.substring(0, 2);
        y = 20 + date.slice(-2);
        d = new Date(y,m);
        return(actualDate > d);
    };
  }
}])

任何人都可以向我解释一下发生了什么? 谢谢, 乙

1 个答案:

答案 0 :(得分:0)

您的过滤器功能在概念上 (尽管您对月份的解释是关闭的,但请在Date构造函数上查找文档)。你的问题是符合角度所期望的。

不是像你在这里假设的那样接收单个日期字符串,而是实际得到需要过滤的完整数组。而不是返回true / false,您需要返回修改后的(已过滤)数组。

但是,您编写的函数与Array.prototype.filter非常吻合,因此可以在this plunker中使用。我修复了。

以下是相关更改:

function filterSingleDate(date) {
    var actualDate = new Date();
    var m,y,d;

    if (/^\d{2}\/\d{2}$/.test(date)) {
        m = date.substring(0, 2) - 1;
        y = 20 + date.slice(-2);
        d = new Date(y,m);
    } else if (/^\d{2}\/\d{4}$/.test(date)) {
        m = date.substring(0, 2) - 1;
        y = date.slice(-4);
        d = new Date(y,m);
    } else if (/^\d{4}$/.test(date)) {
        m = date.substring(0, 2) - 1;
        y = 20 + date.slice(-2);
        d = new Date(y,m);
    }

    return actualDate > d;
}

var FilterModule = angular.module('FilterModule', []).filter('validDate', [function () {
  return function (dateList) {
    return dateList.filter(filterSingleDate);
  };
}]);