मुझे यकीन नहीं है कि यह सबसे कुशल विकल्प है - लेकिन यह काफी सरल है और मेरे लिए काम करता है। ko.computed रिटर्न के रूप में नीचे एक नमूदार सरणी:
self.computedArrayValue = ko.computed(function() {
var all = ko.observableArray([]);
....
return all();
});
कोड भाषा का काम उदाहरण: एचटीएमएल:
<div data-bind="foreach: days">
<button class="btn btn-default btn-lg day" data-bind="text: $data, click: $root.dayPressed"></button>
</div>
दृश्य मॉडल पर
जावास्क्रिप्ट समारोह:
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();
});
मेरा मानना है कि यह उत्तर अधिकांश उपयोग-मामलों के लिए त्रुटिपूर्ण है: गणना किए गए अवलोकन योग्य का मूल्य एक नियमित सरणी है, एक अवलोकन योग्य सरणी नहीं (लगभग जवाब में कहा गया है)। इसलिए, 'listA' या' listB' को अपडेट करना पूरी तरह से अपनी सामग्री को अपडेट करने के बजाय सरणी को प्रतिस्थापित करेगा (जो हम 99% मामलों में चाहते हैं)। ** इसका मतलब है कि आपको इस अवलोकन करने के लिए विचारों को बाध्य नहीं करना चाहिए। ** असल में, यह कोड इसके गैर-गणना वाले संस्करण के रूप में उपयोगी है। विभिन्न दृष्टिकोणों के लिए अन्य उत्तरों देखें। – tne
यह इस मामले में काम नहीं करेगा, लेकिन नॉकआउट प्लगइन [नॉकआउट-अनुमान] (https://github.com/stevesanderson/knockout-projections) नए [सरणी परिवर्तन सदस्यता] का उपयोग करके कहीं अधिक कुशल गणना वाले अवलोकन योग्य सरणी लागू करता है (http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/)। इस प्लगइन को एक कुशल कॉन्सट ऑपरेशन का समर्थन करने के लिए बढ़ाया जा सकता है। – Singularity