2013-03-15 23 views
31

Tôi đang cố gắng thay thế tất cả nội dung của một mục trong một observableArray bằng nội dung mới.Thay thế mục trong observableArray

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { 
    return item.id == value.id; 
}); 
self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); 
self.locations.valueHasMutated(); 

Tôi cũng đã thử

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 

Nhưng không có gì đang làm việc. Chỉ mục đang được truy xuất đúng cách nhưng bản cập nhật của mục không xảy ra.

+0

Ý của bạn là gì về "Nhưng không có gì hoạt động". Bạn không có mục mới trong mảng? Hoặc bạn không thấy thay thế trong giao diện người dùng? Vui lòng đăng html và liên kết của bạn cũng như cách đối tượng vị trí trông như thế nào! – nemesv

+0

cả hai. Mô hình không được cập nhật và không phải là ui vì mô hình không được cập nhật. – bflemi3

Trả lời

45

Hàm thay thế chấp nhận hai tham số, mục bạn muốn thay thế và mục mới bạn muốn thay thế bằng. Bạn đang chuyển vào chỉ mục thay cho mục để thay thế để nó không hoạt động.

Các thay thế cuộc gọi nên là:

self.locations.replace(oldLocation, new location(value)); 

Trên một mặt lưu ý, bạn không nên cần valueHasMutated() cuộc gọi đó, nó sẽ được gọi bởi các replace() gọi.

+9

Tôi phải hỏi, ở đâu trái đất là tài liệu đề cập đến phương pháp thay thế trên một mảng quan sát được? Tôi đã nhìn và nhìn, và không thể nhìn thấy nó ở bất cứ đâu trong tài liệu! –

+4

@PaulManzotti - Mục 7 của http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html đề cập đến các phương pháp được thêm vào. – DaveB

+1

Cảm ơn, tôi sẽ giữ trang đó được đánh dấu trang! :) –

1

Tôi không biết phương thức thay thế trong JavaScript cho mảng hoặc trong Knockout. Tui bỏ lỡ điều gì vậy?

Nếu bạn muốn sử dụng phương pháp thứ hai của bạn, sau đó bạn cần phải truy cập vào các địa điểm như một quan sát được:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 
self.locations.valueHasMutated(); 

dù bạn không khi sử dụng indexOf, như có một phiên bản Knockout đó cho mảng thể quan sát được .

+1

Tôi chưa thấy tài liệu ở bất cứ nơi nào, nhưng trong mã nguồn: https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

tôi chỉ đơn giản muốn đề cập đến một cách khác để làm điều đó:

self.locations.splice(
    self.locations.indexOf(location), // Index of the 1st element to remove 
    1,         // Number of elements to remote at this index 
    new fizi.ko.models.location(value) // A param for each element to add at the index 
); 

Knockout bao gồm splice trong tài liệu hướng dẫn của nó, nhưng không bao gồm replace: Knockout Obervable Arrays Docs. Tuy nhiên, nếu bạn nhìn vào mã nguồn bạn sẽ thấy rằng cả hai chức năng được thực hiện (ít nhất là trong KO 3.0, tôi không biết nếu thiếu replace trong các phiên bản trước).

Các vấn đề liên quan