如何在添加之前检查重复的签名。在下面的场景中,如果没有签名找到列表,我想添加签名。
var Signature = function (name, interestDeclared) {
this.Name = ko.observable(name);
this.RelevantInterest = ko.observable(interestDeclared);
}
viewModel = {
signatures: ko.observableArray([]),
addSignature: function () {
var name = $('#signatureName').val();
var intd = $('#interest').is(':checked');
this.signatures.push(new Signature(name, intd));
},
deleteSignature: function (signature) {
this.signatures.remove(signature);
},
insertWitness: function (signature, position) {
this.signatures.splice(position, 0, signature);
}
};
ko.applyBindings(viewModel, document.getElementById("signatories"));
谢谢, -Naren
答案 0 :(得分:8)
您还可以在KO框架中使用一些内置的实用程序功能。我过去用这种技术解决了这个问题:
var name = $('#signatureName').val(),
intd = $('#interest').is(':checked'),
match = ko.utils.arrayFirst(this.signatures(), function (item) {
if (item.Name() === name) {
return selectedCounsel;
}
});
if (!match) {
// This means it wasn't already in our array, so we'll add it.
this.signatures.push(new Signature(name, intd));
}
我也同意@madcapnmckay,不要使用jQuery从输入中查找值,更新模型,以便signatureName
和interest
绑定到您的模型并使用这些值。
答案 1 :(得分:3)
使用jQuery grep函数:
addSignature: function () {
var name = $('#signatureName').val();
var intd = $('#interest').is(':checked');
if($.grep(this.signatures(), function(el){return el.Name() === name;}).length === 0){
this.signatures.push(new Signature(name, intd));
}
}
答案 2 :(得分:0)
您可以使用像这样的数组实用程序函数。
if (!Array.prototype.findIndexOf) {
Array.prototype.findIndexOf = function (search) {
var len = this.length, i, item;
if (typeof search != "function") {
throw new TypeError();
}
for (i = 0; i < len; i += 1) {
item = this[i];
if (search.apply(this, [item])) {
return i;
}
}
return -1;
};
}
然后更新你的addSignature方法。
addSignature: function () {
var name = $('#signatureName').val();
var intd = $('#interest').is(':checked');
var found = this.signatures().findIndexOf(function(s) { return s.Name() === name; });
if (found == -1) {
this.signatures.push(new Signature(name, intd));
}
}
Here's a great resource表示与js数组相关的所有事情。
FYI。您不应该通过jquery选择器获取名称/兴趣值。而是分别使用KO的值/检查绑定将值绑定到viewModel。这样,您的addSignature方法就可以与标记完全分离。
希望这有帮助。