2012-03-27 6 views
1

Wie kann ich die doppelten Signaturen vor dem Hinzufügen überprüfen. Im folgenden Szenario wollte ich Signatur hinzufügen, wenn keine Signatur die Liste gefunden hat.Überprüfen duplizieren mit 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")); 

Danke, -Naren

Antwort

3

Mit jQuery grep Funktion:

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

Sie können ein Array Utility-Funktion wie folgt verwenden.

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

Dann aktualisieren Sie Ihre addSignature-Methode wie folgt.

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 für alle verwandten js Dinge Array.

FYI. Sie sollten die Namen-/Interessenwerte nicht über einen Jquery-Selektor erhalten. Verwenden Sie stattdessen den Wert/checked bindings von KO, um den Wert an Ihr viewModel zu binden. Auf diese Weise kann Ihre addSignature-Methode vollständig vom Markup getrennt werden.

Hoffe, das hilft.

8

Sie könnten auch einige in Utility-Funktionen im Rahmen KO gebaut verwenden. Ich habe dieses Problem mit dieser Technik in der Vergangenheit gelöst:

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

ich auch mit @madcapnmckay zustimmen, sind Sie nicht jQuery verwenden, um die Werte von Eingang zu finden, die Ihr Modell zu aktualisieren, so dass signatureName und interest sind verpflichtet, dein Modell und verwende diese Werte.