使用ko.observableArray检查重复项

时间:2012-03-27 16:10:03

标签: javascript arrays knockout.js

如何在添加之前检查重复的签名。在下面的场景中,如果没有签名找到列表,我想添加签名。

    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

3 个答案:

答案 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从输入中查找值,更新模型,以便signatureNameinterest绑定到您的模型并使用这些值。

答案 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方法就可以与标记完全分离。

希望这有帮助。