asp.net-mvc - 防止 knockout 可观察数组上的重复

标签 asp.net-mvc knockout.js

我有一个与此类似的 ViewModel(简化版):

var Person = function(){
    var self = this;
    self.Name = ko.observable();
    self.LastName = ko.observable();
    self.DriverId = ko.observable();
}

var MainViewModel = function(){
    var self = this;
    self.People = ko.observableArray();
}

我需要验证驱动程序 ID 对于数组的每个元素都是唯一的。做这个的最好方式是什么?是否可以创建 MVC 属性?我找不到具体方法,因为我只针对特定类而不是集合执行此操作。

这是一个带有 ViewModel 的 JsFiddle:http://jsfiddle.net/amhedh/VgJ59/6/

最佳答案

您可以创建 Knockout Custom Validator每当数组内任何人员对象的 driverId 属性发生更改时,它将检查您的整个人员数组。验证器将根据匹配返回 true 或 false(如果发现重复条目​​,则返回 false,否则返回 true),进一步的 ko 验证将自动为您插入错误消息。

我创建了一个自定义验证器,它将为您完成这项工作。这是验证器:

var Unique = function(val, params)
{
  var isValid = true;
      ko.utils.arrayFirst(params[0](), function(item){
       if(val === item[params[2]]() && item !== params[1])
       {
           isValid = false;
           return true;
       }
      });
  return isValid;
};

这是用法:

....
.....
self.DriverId = ko.observable(person.DriverId).extend
 ({
   validation: { 
     validator: Unique, 
     message: 'DriverId is duplicate.', 
     params: [viewModel.People, self, 'DriverId']
   }
});
... 
....

Demo fiddle (更改 driverId 文本框值以检查验证)

关于asp.net-mvc - 防止 knockout 可观察数组上的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992615/

相关文章:

javascript - 通过多个参数对 oberservableArray 进行排序

c# - 一次性 Ajax.ActionLink,如 Ajax.BeginForm

c# - 使用 jQuery 日期选择器和创建 View 无法正常工作

asp.net - 从 Controller 构造函数访问 Request.Cookies

javascript - 将 Javascript 变量插入 Html.Partial ViewDataDictionary ASP.NET MVC

knockout.js - KnockoutJS - 显示加载和无数据消息

arrays - 从可观察数组中获取第 n 个项目

javascript - 防止 knockout textInput 数据绑定(bind)在键入时更新字段值

asp.net-mvc - MVC中如何获取之前的路由

javascript - Knockout JS - 通过自定义脚本更新ViewModel数据