問題をひっくり返した方がうまくいきます。追加しようとしているテキスト オブザーバブル (複数のフィールドが含まれる場合はオブザーバブル オブジェクト) に検証を追加します。次に、追加をトリガーするときに、オブザーバブルが有効かどうかを確認します。有効な場合は、配列に追加します。
http://jsfiddle.net/jearles/XY9XH/
--
<span>New Item: <input data-bind="value:newItem" /> <button data-bind="click: addItem">Add</button></span>
<div data-bind="foreach: items">
<span data-bind="text: $data"></span>
</div>
--
ko.validation.rules['duplicate'] = {
validator: function (item, array) {
return array.indexOf(item) == -1;
},
message: 'Value already exists!'
};
ko.validation.registerExtenders();
var ViewModel = function() {
var self = this;
self.items = ko.observableArray();
self.newItem = ko.observable().extend({duplicate: self.items});
self.addItem = function() {
if (self.newItem().length > 0 && self.newItem.isValid()) {
self.items.push(self.newItem());
self.newItem(null);
}
};
}
ko.applyBindings(new ViewModel());
</p>