与淘汰赛验证插件独特的价值确认

我使用KnockoutJS与淘汰赛验证插件来验证一个表单上的字段。 我在验证一个值是使用本地验证规则独特的问题- unique

我使用的是从瑞安·尼迈耶的编辑模式,允许用户编辑或创建一个Location 。 这里是我的小提琴看到全部我的问题。

function Location(data, names) { var self = this; self.id = data.id; self.name = ko.observable().extend({ unique: { collection: names }}); // other properties self.errors = ko.validation.group(self); // update method left out for brevity } function ViewModel() { var self = this; self.locations = ko.observableArray([]); self.selectedLocation = ko.observable(); self.selectedLocationForEditing = ko.observable(); self.names = ko.computed(function(){ return ko.utils.arrayMap(self.locations(), function(item) { return item.name(); }); }); self.edit = function(item) { self.selectedLocation(item); self.selectedLocationForEditing(new Location(ko.toJS(item), self.types)); }; self.cancel = function() { self.selectedLocation(null); self.selectedLocationForEditing(null); }; self.update = function(item) { var selected = self.selectedLocation(), updated = ko.toJS(self.selectedLocationForEditing()); //get a clean copy if(item.errors().length == 0) { selected.update(updated); self.cancel(); } else alert("Error"); }; self.locations(ko.utils.arrayMap(seedData, function(item) { return new Location(item, self.types, self.names()); })); }

我虽然有一个问题。 由于Location被编辑,是从“超然”的locations observableArray(见Location.edit法),当我更改name的独立Location的值不会在更新的names来计算阵列。 因此,当验证规则比较它的names数组后总是回到真正有效的状态,因为计数器将永远只能是1或0(请参见下面的淘汰赛验证算法)

在选项参数为unique验证规则,我可以在一个属性传externalValue 。 如果该值不是未定义则它将检查以查看是否匹配的名称的计数大于或等于1而不是2,这适用除外情况下,当用户改变了名称,进到另一个域,然后返回的名称,并希望改回原始值。 该规则只看到该值已经存在的names数组,并返回一个false有效状态。

下面是从knockout.validation.js处理该算法unique规则...

function (val, options) { var c = utils.getValue(options.collection), external = utils.getValue(options.externalValue), counter = 0; if (!val || !c) { return true; } ko.utils.arrayFilter(ko.utils.unwrapObservable(c), function (item) { if (val === (options.valueAccessor ? options.valueAccessor(item) : item)) { counter++; } }); // if value is external even 1 same value in collection means the value is not unique return counter < (external !== undefined && val !== external ? 1 : 2); }

我想过用这个作为基础来创建自定义的验证规则,但我一直陷入如何当用户想回到原来的值处理这种情况。

我明白任何及所有的帮助。

--------------解决方案-------------

一个可能的解决方案是不包括 name (创建你所需要的完整列表,一个新的项目时,当然)的独特验证当前编辑项目。

因此,更改名称的位置时,返回到其原始值独特的支票将不会被触发:

self.namesExceptCurrent = function(name){
return ko.utils.arrayMap(self.locations(), function(item) {
if (item.name() !== name)
return item.name();
});
}

self.edit = function(item) {
self.selectedLocation(item);
self.selectedLocationForEditing(
new Location(ko.toJS(item),
self.types,
self.namesExceptCurrent(item.name())));
};

演示的jsfiddle。

分类:JavaScript的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.909 (s). 10 q(s)