Làm thế nào để đẩy một mục có điều kiện trong một mảng có thể quan sát được?


103

Tôi muốn pushmột mặt hàng mới vào một observableArray, nhưng chỉ khi mặt hàng đó chưa có mặt. Có chức năng "tìm" hoặc mô hình được đề xuất nào để đạt được điều này trong KnockoutJS không?

Tôi nhận thấy rằng removehàm trên an observableArraycó thể nhận một hàm để truyền trong một điều kiện. Tôi gần như muốn có cùng chức năng, nhưng chỉ đẩy nó nếu điều kiện được chuyển vào là đúng hoặc không đúng.

Câu trả lời:


223

Một ObservableArray hiển thị một indexOfhàm (wrapper to ko.utils.arrayIndexOf). Điều này cho phép bạn làm:

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

Nếu cả hai thực sự không phải là một tham chiếu đến cùng một đối tượng và bạn muốn chạy logic so sánh tùy chỉnh, thì bạn có thể sử dụng ko.utils.arrayFirstnhư sau:

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

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

Điều này có thực hiện so sánh tất cả các thuộc tính trên itemToAdd không? Tôi chỉ cần kiểm tra thuộc tính Id.
jaffa

5
Điều này sẽ kiểm tra xem cả hai có phải là cùng một đối tượng hay không. Nếu bạn cần kiểm tra các thuộc tính riêng lẻ, thì bạn có thể sử dụng ko.utils.arrayFirst. Tôi sẽ thêm một mẫu vào câu trả lời.
RP Niemeyer

4
Mẹo hay, nhưng tôi đã phải thay đổi itemToAdd.id === item.id thành itemToAdd.id () === item.id (). Tôi đã đăng mã của mình trong câu trả lời tiếp theo.
Rake36

1
@ Rake36 điều này sẽ phụ thuộc vào việc bạn có nghĩ rằng id mặt hàng của mình sẽ thay đổi hay không và cần phải được quan sát.
Louis

1
@spaceman - bạn đang gặp vấn đề gì ===? Bạn có một mẫu? Bạn đang so sánh chuỗi với số hay cái gì đó?
RP Niemeyer

11

Cảm ơn RP. Đây là một ví dụ về việc sử dụng đề xuất của bạn để trả về thuộc tính 'name' thông qua thuộc tính 'id' của đối tượng từ trong mô hình chế độ xem của tôi.

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

Trong HTML, tôi có như sau ($ cha là do nó nằm trong vòng lặp hàng bảng):

<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

tìm kiếm một đối tượng trong 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

Tôi sẽ thêm "valueWillMutate ()" trước các thay đổi và "valueHasMutated ()" sau chúng.

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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.