2011-12-07 19 views
102

Chciałbym push nowy element na observableArray, ale tylko wtedy, gdy element nie jest już obecny. Czy istnieje funkcja "znajdź" lub zalecany wzorzec do osiągnięcia tego w KnockoutJS?Jak warunkowo przesuwać element w tablicy obserwowalnej?

Zauważyłem, że funkcja remove na urządzeniu observableArray może odbierać funkcję przekazywania stanu. Niemal chcę tej samej funkcjonalności, ale tylko ją popchnąć, jeśli spełniony warunek jest lub nie jest prawdziwy.

Odpowiedz

221

ObservableArray udostępnia funkcję indexOf (opakowanie do ko.utils.arrayIndexOf). Pozwala to zrobić:

if (myObservableArray.indexOf(itemToAdd) < 0) { 
    myObservableArray.push(itemToAdd); 
} 

Jeżeli dwa nie są rzeczywiście odniesienie do tego samego obiektu i chcesz uruchomić logiki porównania niestandardowy, a następnie można użyć ko.utils.arrayFirst jak:

var match = ko.utils.arrayFirst(myObservableArray(), function(item) { 
    return itemToAdd.id === item.id; 
}); 

if (!match) { 
    myObservableArray.push(itemToAdd); 
} 
+0

Czy to porównanie wszystkich właściwości na itemToAdd? Muszę przetestować tylko właściwość Id. – jaffa

+5

Spowoduje to sprawdzenie, czy oba są dokładnie tym samym obiektem. Jeśli chcesz sprawdzić poszczególne właściwości, możesz użyć 'ko.utils.arrayFirst'. Dodam próbkę do odpowiedzi. –

+4

Doskonała wskazówka, ale musiałem zmienić itemToAdd.id === item.id na itemToAdd.id() === item.id(). Wysłałem swój kod w następnej odpowiedzi. – Rake36

11

Dzięki RP . Oto przykład użycia Twojej sugestii do zwrócenia właściwości 'name' przez właściwość "id" obiektu z mojego modelu widoku.

self.jobroles = ko.observableArray([]); 

    self.jobroleName = function (id) 
    { 
     var match = ko.utils.arrayFirst(self.jobroles(), function (item) 
     { 
      return item.id() === id(); //note the() 
     }); 
     if (!match) 
      return 'error'; 
     else 
      return match.name; 
    }; 

W HTML, mam następujący ($ rodzic jest ze względu na to będąc wewnątrz pętli wiersza tabeli):

<select data-bind="visible: editing, hasfocus: editing, options: $parent.jobroles, optionsText: 'name', optionsValue: 'id', value: jobroleId, optionsCaption: '-- Select --'"> 
          </select> 
<span data-bind="visible: !editing(), text: $parent.jobroleName(jobroleId), click: edit"></span></td> 
0

wyszukać obiekt w ko.observableArray

function data(id,val) 
{ var self = this; 
self.id = ko.observable(id); 
self.valuee = ko.observable(val); } 

var o1=new data(1,"kamran"); 
var o2=new data(2,"paul"); 
var o3=new data(3,"dave"); 
var mysel=ko.observable(); 
var combo = ko.observableArray(); 

combo.push(o1); 
combo.push(o2); 
combo.push(o3); 
function find() 
{ 
     var ide=document.getElementById("vid").value;  
     findandset(Number(ide),mysel); 
} 

function indx() 
{ 
    var x=document.getElementById("kam").selectedIndex; 
    alert(x); 
} 

function getsel() 
{ 
    alert(mysel().valuee()); 
} 


function findandset(id,selected) 
{ 
    var obj = ko.utils.arrayFirst(combo(), function(item) { 
    return id=== item.id(); 
}); 
    selected(obj); 
} 

findandset(1,mysel); 
ko.applyBindings(combo); 


<select id="kam" data-bind="options: combo, 
        optionsText: 'valuee', 
        value: mysel, 
        optionsCaption: 'select a value'"> 

        </select> 
<span data-bind="text: mysel().valuee"></span> 
<button onclick="getsel()">Selected</button> 
<button onclick="indx">Sel Index</button> 
<input id="vid" /> 
<button onclick="find()">Set by id</button> 

http://jsfiddle.net/rathore_gee/Y4wcJ/

0

Dodałbym "wartość WillMutate() "przed zmianami i" valueHasMutated() "po nich.

Powiązane problemy