Tôi không chắc đây có phải là lựa chọn hiệu quả nhất hay không - nhưng nó khá đơn giản và phù hợp với tôi. Lợi nhuận ko.computed một mảng quan sát được như sau:
self.computedArrayValue = ko.computed(function() {
var all = ko.observableArray([]);
....
return all();
});
Một ví dụ làm việc của mã: Html:
<div data-bind="foreach: days">
<button class="btn btn-default btn-lg day" data-bind="text: $data, click: $root.dayPressed"></button>
</div>
chức năng Javascript trên mô hình điểm:
self.days = ko.computed(function() {
var all = ko.observableArray([]);
var month = self.selectedMonth(); //observable
var year = self.selectedYear(); //observable
for (var i = 1; i < 29; i++) {
all.push(i);
}
if (month == "Feb" && year % 4 == 0) {
all.push(29);
} else if (["Jan","Mar","May","Jul","Aug","Oct","Dec"].find((p) => p == month)) {
[29,30,31].forEach((i) => all.push(i));
} else if (month != "Feb") {
[29,30].forEach((i) => all.push(i));
}
return all();
});
Tôi tin câu trả lời này là thiếu sót cho hầu hết các trường hợp sử dụng: giá trị của quan sát được tính toán là một mảng thông thường, không phải là một mảng quan sát được (gần như được nêu trong câu trả lời). Do đó, việc cập nhật 'listA' hoặc' listB' sẽ thay thế hoàn toàn bản thân mảng thay vì cập nhật nội dung của nó (đó là những gì chúng ta muốn trong 99% các trường hợp). ** Điều này có nghĩa là bạn không nên liên kết các khung nhìn với điều này. ** Trong thực tế, mã này hữu ích như biến thể không được tính toán của nó. Xem các câu trả lời khác cho các cách tiếp cận khác nhau. – tne
Nó sẽ không hoạt động trong trường hợp này, nhưng plugin knockout [knockout-projections] (https://github.com/stevesanderson/knockout-projections) thực hiện các mảng quan sát được tính toán hiệu quả hơn bằng cách sử dụng [đăng ký thay đổi mảng mới] http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/). Plugin này có thể được mở rộng để hỗ trợ hoạt động concat hiệu quả. – Singularity