2012-03-27 17 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

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配列に関連します。

FYI。 jqueryセレクタを使用して名前/関心値を取得するべきではありません。代わりにKOのvalue/checkedバインディングをそれぞれ使用して、値をviewModelにバインドします。こうすることで、addSignatureメソッドをマークアップから完全に切り離すことができます。

これが役に立ちます。 jQueryのgrepの機能を使用して

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)); 
} 

私もsignatureNameinterestがバインドされるようにモデルを更新し、入力からの値を見つけるために、jQueryのを使用していない、@madcapnmckayに同意しますそれらの値を使用します。

関連する問題