首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ko.observableArray检查重复

使用ko.observableArray检查重复
EN

Stack Overflow用户
提问于 2012-03-28 00:10:03
回答 3查看 5.7K关注 0票数 1

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

代码语言:javascript
复制
    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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-28 00:46:58

使用jQuery的grep函数:

代码语言:javascript
复制
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));
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-28 01:21:54

您还可以使用KO框架中的一些内置实用程序函数。我以前已经用这个技术解决了这个问题:

代码语言:javascript
复制
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绑定到您的模型并使用这些值。

票数 8
EN

Stack Overflow用户

发布于 2012-03-28 00:39:37

您可以像这样使用数组实用程序函数。

代码语言:javascript
复制
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方法。

代码语言:javascript
复制
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));
   }
}

所有与js数组相关的东西的Here's a great resource

仅供参考。您不应该通过jquery选择器获取name/interest值。相反,分别使用KO的值/检查绑定将值绑定到viewModel。这样,您的addSignature方法就可以与标记完全解耦。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9893435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档