이 답변은 @josh가 준 것과 개념적으로 동일하지만 더 일반적인 래퍼로 제공됩니다. 참고 :이 버전은 '쓰기 가능'계산 용입니다.
Typescript를 사용하고 있으므로 먼저 ts.d 정의를 포함했습니다. 따라서 당신과 관련이 없다면이 첫 번째 부분을 무시하십시오.
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
함수에 의해 '방문'되는 관찰 가능 항목의 변경을 트리거하지 않는 무언가를 업데이트하는 경우입니다 .
예를 들어 LocalStorage를 사용하여 일부 값을 설정하고 있지만 재평가를 트리거하기 위해 관찰 가능한 항목에는 변경 사항이 없습니다.
hasUserClickedFooButton = ko.notifyingWritableComputed(
{
read: () =>
{
return LocalStorageHelper.getBoolValue('hasUserClickedFooButton');
},
write: (v) =>
{
LocalStorageHelper.setBoolValue('hasUserClickedFooButton', v);
}
});
모든 내가 변화를 필요로합니다이었다 ko.computed
에 ko.notifyingWritableComputed
다음 모든 자체 처리합니다.
내가 전화 할 때 hasUserClickedFooButton(true)
하면 '더미'Observable이 증가하여 LocalStorage의 값이 업데이트 될 때 구독자 (및 구독자)가 새 값을 얻도록 강제합니다.
(참고 : 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 .