防止敲除可观察数组上的重复

时间:2013-04-13 20:33:43

标签: 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/

1 个答案:

答案 0 :(得分:4)

您可以创建一个Knockout Custom Validator,只要数组中任何人物对象的 driverId 属性发生变化,就会检查整个人员阵列。 Validator将根据匹配返回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文本框值以检查验证)