Câu trả lời này về mặt khái niệm giống với câu mà @josh đã đưa ra, nhưng được trình bày dưới dạng trình bao bọc chung chung hơn. Lưu ý: phiên bản này dành cho máy tính 'có thể ghi'.
Tôi đang sử dụng Typecript nên tôi đã đưa vào định nghĩa ts.d trước. Vì vậy, hãy bỏ qua phần đầu tiên này nếu không liên quan đến bạn.
interface KnockoutStatic
{
notifyingWritableComputed<T>(options: KnockoutComputedDefine<T>, context ?: any): KnockoutComputed<T>;
}
Thông báo-có thể ghi-tính
Một wrapper cho một ghi observable
rằng luôn gây thuê bao để được thông báo - ngay cả khi không quan sát được cập nhật như là kết quả của các write
cuộc gọi
Chỉ cần thay thế function<T> (options: KnockoutComputedDefine<T>, context)
bằng function(options, context)
nếu bạn không sử dụng Typecript.
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);
}
Trường hợp sử dụng chính cho trường hợp này là khi bạn đang cập nhật thứ gì đó sẽ không kích hoạt thay đổi trong một đối tượng có thể quan sát được hàm 'truy cập' read
.
Ví dụ: tôi đang sử dụng LocalStorage để đặt một số giá trị, nhưng không có thay đổi nào đối với bất kỳ giá trị nào có thể quan sát được để kích hoạt đánh giá lại.
hasUserClickedFooButton = ko.notifyingWritableComputed(
{
read: () =>
{
return LocalStorageHelper.getBoolValue('hasUserClickedFooButton');
},
write: (v) =>
{
LocalStorageHelper.setBoolValue('hasUserClickedFooButton', v);
}
});
Lưu ý rằng tất cả những gì cần thiết để thay đổi là ko.computed
để ko.notifyingWritableComputed
rồi mọi thứ sẽ chăm sóc của chính nó.
Khi tôi gọi hasUserClickedFooButton(true)
thì 'dummy' có thể quan sát được tăng dần buộc bất kỳ người đăng ký nào (và người đăng ký của họ) phải nhận giá trị mới khi giá trị trong LocalStorage được cập nhật.
(Lưu ý: bạn có thể nghĩ rằng bộ notify: 'always'
mở rộng là một tùy chọn ở đây - nhưng đó là một cái gì đó khác).
Có một giải pháp bổ sung cho một thiết bị quan sát được tính toán chỉ có thể đọc được:
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();
Từ nhận xét @mbest https://github.com/knockout/knockout/issues/1019 .