2011-12-07 20 views
102

push ürününü observableArray numaralı ürüne eklemek istiyorum, ancak sadece ürün henüz mevcut değilse. KnockoutJS'de bunu bulmak için herhangi bir "bul" işlevi veya önerilen desen var mı?Bir öğeyi gözlemlenebilir bir diziye koşullu olarak nasıl itmeli?

Bir observableArray numaralı remove işlevinin bir koşuldan geçmek için bir işlev alabildiğini fark ettim. Neredeyse aynı işlevselliği isterim, ancak yalnızca koşul doğruysa veya doğru değilse onu itmek için.

cevap

221

Gözlemlenebilir bir Array, indexOf işlevini (sarıcıyı ko.utils.arrayIndexOf'a) gösterir. İki aslında aynı nesneye bir referans değildir ve o zaman gibi ko.utils.arrayFirst kullanabilirsiniz, özel karşılaştırma mantığı çalıştırmak istiyorsanız

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

:

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

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

Bu, itemToAdd'daki tüm özellikleri karşılaştırıyor mu? Sadece bir Id özelliği için test etmem gerekiyor. – jaffa

+5

Bu, ikinin aynı nesne olup olmadığını kontrol edecektir. Bireysel özellikleri kontrol etmeniz gerekiyorsa, o zaman 'ko.utils.arrayFirst' kullanabilirsiniz. Cevaba bir örnek ekleyeceğim. –

+4

Mükemmel ipucu, ancak itemToAdd.id === item.id öğesini itemToAdd.id() === item.id() olarak değiştirmem gerekiyordu. Kodumu bir sonraki cevapta yayınladım. – Rake36

11

teşekkür RP Bu yapmanızı sağlar . Burada, 'ad' özelliğini, benim görünüm modelimdeki nesnenin 'id' özelliği aracılığıyla döndürmek için önerinizi kullanmanın bir örneği.

<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

bir 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> 
bir nesneyi arama: HTML'de

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

i aşağıdaki ($ ebeveyn bu tablo satırı döngü içinde olmak nedeniyle) var

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

0

"value" eklerim Değişikliklerden önce WillMutate() "ve ondan sonra" valueHasMutated() ".

for (var i = 0; i < data.length; i++) { 
    var needChange = false; 
    var itemToAdd = data[i]; 
    var match = ko.utils.arrayFirst(MyArray(), function (item) { 
     return (itemToAdd.Code === item.Code); 
    }); 
    if (!match && !needChange) { 
     MyArray.valueWillMutate(); 
     needChange = true; 
    } 
    if (!match) { 
     MyArray.push(itemToAdd); 
    } 
} 
if (needChange) { 
    MyArray.valueHasMutated(); 
} 
İlgili konular