यह उत्तर वैचारिक रूप से वैसा ही है जैसा कि एक @ जोश ने दिया था, लेकिन एक अधिक सामान्य आवरण के रूप में प्रस्तुत किया। नोट: यह संस्करण एक 'लिखने योग्य' गणना के लिए है।
मैं टाइपस्क्रिप्ट का उपयोग कर रहा हूं इसलिए मैंने पहले tdd परिभाषा को शामिल किया है। इसलिए इस पहले भाग को नजरअंदाज करें यदि आप के लिए प्रासंगिक नहीं है।
interface KnockoutStatic
{
notifyingWritableComputed<T>(options: KnockoutComputedDefine<T>, context ?: any): KnockoutComputed<T>;
}
सूचना-लेखन-संगणित
एक लिखने योग्य के लिए एक आवरण observable
जो हमेशा ग्राहकों को सूचित करता है - भले ही कोई वेधशाला write
कॉल के परिणामस्वरूप अपडेट नहीं की गई हो
यदि आप टाइपस्क्रिप्ट का उपयोग नहीं करते हैं तो बस इसके function<T> (options: KnockoutComputedDefine<T>, context)
साथ बदलें function(options, context)
।
ko.notifyingWritableComputed = function<T> (options: KnockoutComputedDefine<T>, context)
{
var _notifyTrigger = ko.observable(0);
var originalRead = options.read;
var originalWrite = options.write;
options.read = () =>
{
_notifyTrigger();
return originalRead();
};
options.write = (v) =>
{
originalWrite(v);
_notifyTrigger(_notifyTrigger() + 1);
};
return ko.computed(options, context);
}
इसके लिए मुख्य उपयोग मामला तब है जब आप कुछ ऐसा अपडेट कर रहे हैं जो अन्यथा read
फ़ंक्शन द्वारा 'अवलोकन' किए गए अवलोकन में परिवर्तन को ट्रिगर नहीं करेगा ।
उदाहरण के लिए मैं कुछ मान सेट करने के लिए लोकलस्टोरेज का उपयोग कर रहा हूं, लेकिन पुनर्मूल्यांकन को ट्रिगर करने के लिए किसी भी अवलोकन के लिए कोई परिवर्तन नहीं है।
hasUserClickedFooButton = ko.notifyingWritableComputed(
{
read: () =>
{
return LocalStorageHelper.getBoolValue('hasUserClickedFooButton');
},
write: (v) =>
{
LocalStorageHelper.setBoolValue('hasUserClickedFooButton', v);
}
});
ध्यान दें कि सभी मैं परिवर्तन करने की जरूरत थी ko.computed
करने के लिए ko.notifyingWritableComputed
और उसके बाद सब कुछ खुद का ख्याल रखता है।
जब मैं फोन करता हूं hasUserClickedFooButton(true)
तो 'डमी' देखने योग्य किसी भी सब्सक्राइबर्स (और उनके सब्सक्राइबर) को नए मूल्य प्राप्त करने के लिए मजबूर किया जाता है, जब लोकलस्टोरेज में वैल्यू अपडेट होती है।
(नोट: आप सोच सकते हैं कि notify: 'always'
एक्सटेंडर यहां एक विकल्प है - लेकिन यह कुछ अलग है)।
एक गणना योग्य अवलोकन के लिए एक अतिरिक्त समाधान है जो केवल पठनीय है:
ko.forcibleComputed = function(readFunc, context, options) {
var trigger = ko.observable().extend({notify:'always'}),
target = ko.computed(function() {
trigger();
return readFunc.call(context);
}, null, options);
target.evaluateImmediate = function() {
trigger.valueHasMutated();
};
return target;
};
myValue.evaluateImmediate();
@Mbest टिप्पणी से https://github.com/knockout/knockout/issues/1019 ।