验证ng-repeat Angular

时间:2017-05-30 09:03:18

标签: javascript angularjs validation

我在AngularJS(v1.x)的表格中使用ng-repeat编辑了一个数据项,其中的数据包含名称和日期的日期。

var myPersons = [{
        name: "John Smith",
        coverFromDate: "05/13/2016",
        coverToDate: "05/15/2016"
    },
    {
        name: "Fanny Schmelter",
        coverFromDate: "05/16/2016",
        coverToDate: "05/18/2016"
    }
];

我已经对两个日期更改添加了验证,以确保日期从使用指令的日期之前开始,该指令很好地在行中显示错误消息。

我想在列表中添加一些验证,以确保整个列表中没有输入重叠日期。如果有,我想要出现一条错误消息(理想情况下与无效项目一起)和要标记为无效的表单(以防止提交)。

我对最好的方法感到有点难过。如果有人有解决方案,那么我很想看到 - 可以应用相同的逻辑来确保独特的人名,所以不要担心使用日期 - 我感兴趣的机制 - 如果这是一个指令与控制器分开,还是应该是控制器方法等。可以在从/到现场的日期延迟后触发吗?

我已经找了答案,但在2天内几乎找不到任何东西。

我为此here创建了一个Plnkr。

更新

我偶然发现了这个问题here。这似乎使控制器知道视图。

我通过在控制器here中添加验证来重新设计上述plnkr以获得解决方案。这是在Angular世界做事的最佳方式吗?在我看来,控制器变得更容易识别 - 即知道字段的名称并了解表单验证方法。

1 个答案:

答案 0 :(得分:1)

 don't fret about using dates

不确定你的意思,因为你的其余描述似乎暗示,你正试图解决与日期相关的问题。

要确定是否存在像coverToDate这样的重复键,您可以在ES6中执行类似的操作

let myPersons = [{
        name: "John Smith",
        coverFromDate: "05/13/2016",
        coverToDate: "05/15/2016"
    },
    {
        name: "Fanny Schmelter",
        coverFromDate: "05/16/2016",
        coverToDate: "05/18/2016"
    },
    {
        name: "Plankton",
        coverFromDate: "05/16/2016",
        coverToDate: "05/18/2016"
    }
];

let arr = [];

myPersons.forEach(function(item) {
    let a = item['coverToDate'];
    let b = item['name'];
    let set = new Set(arr);

    if (!set.has(a)){
      arr.push(a);
      console.log(`added ${b} with ${a}`);
    }
    else{
      console.log(`ERROR: ${b} has duplicate ${a}`);
    }
});

您可以将验证放入服务/工厂包装器中,以使其可重用。你应该能够使用lodash的方法来实现它的等价物,例如ES5中的.every,.forEach,.partial,.has。

我建议使用ng-messages进行任何其他验证检查