2012-03-27 43 views
1

如何在添加前檢查重複簽名。在下面的場景中,如果沒有簽名找到列表,我想添加簽名。使用ko.observableArray檢查重複

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

使用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)); 
    } 
} 
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數組相關的所有東西。

僅供參考。你不應該通過jquery選擇器獲取名稱/興趣值。相反,使用KO的value/checked綁定分別將值綁定到viewModel。這樣你的addSignature方法就可以完全與標記分離。

希望這會有所幫助。

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必然你的模型並使用這些值。