Bir öğeyi gözlemlenebilir bir diziye koşullu olarak nasıl itebilirim?


103

pushYeni bir öğeyi bir üzerine eklemek istiyorum observableArray, ancak yalnızca öğe zaten mevcut değilse. KnockoutJS'de bunu başarmak için herhangi bir "bul" işlevi veya önerilen model var mı?

Bir removeüzerindeki observableArrayişlevin bir koşulu geçmek için bir işlev alabileceğini fark ettim . Neredeyse aynı işlevselliği istiyorum, ancak onu yalnızca geçen koşul doğru olduğunda veya olmadığında zorlamak istiyorum.

Yanıtlar:


223

ObservableArray bir indexOfişlevi (sarmalayıcı ko.utils.arrayIndexOf) gösterir. Bu, şunları yapmanızı sağlar:

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

İkisi aslında aynı nesneye referans değilse ve özel karşılaştırma mantığı çalıştırmak istiyorsanız, aşağıdaki ko.utils.arrayFirstgibi kullanabilirsiniz :

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

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

Bu, itemToAdd üzerindeki tüm özelliklerin bir karşılaştırmasını yapar mı? Yalnızca bir Kimlik özelliğini test etmem gerekiyor.
jaffa

5
Bu, ikisinin tamamen aynı nesne olup olmadığını kontrol edecektir. Bireysel mülkleri kontrol etmeniz gerekiyorsa, kullanabilirsiniz ko.utils.arrayFirst. Cevaba bir örnek ekleyeceğim.
RP Niemeyer

4
Harika bir ipucu, ancak itemToAdd.id === item.id'yi itemToAdd.id () === item.id () olarak değiştirmek zorunda kaldım. Kodumu sonraki cevapta gönderdim.
Rake36

1
@ Rake36 bu, öğe kimliğinizin değişip değişmeyeceğini ve gözlemlenebilir olması gerekip gerekmediğini düşündüğünüze bağlı olacaktır.
Louis

1
@spaceman - hangi sorunu yaşıyorsunuz ===? Bir örneğiniz var mı? Dizeleri sayılarla falan mı karşılaştırıyorsunuz?
RP Niemeyer

11

Teşekkürler RP. Burada, görünüm modelimin içinden nesnenin "id" özelliği aracılığıyla "name" özelliğini döndürmek için önerinizin kullanımına bir örnek verilmiştir.

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

HTML'de aşağıdakilere sahibim ($ parent bunun bir tablo satırı döngüsünün içinde olmasından kaynaklanmaktadır):

<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

ko.observableArray içindeki bir nesneyi ara

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

Değişikliklerden önce "valueWillMutate ()" ve onlardan sonra "valueHasMutated ()" eklerdim.

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();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.