새로운 값을 받기 전에 해당 Observable에 대한 구독 내에서 Observable의 현재 값을 얻을 수 있습니까?
예:
this.myObservable = ko.observable();
this.myObservable.subscribe(function(newValue){
//I'd like to get the previous value of 'myObservable' here before it's set to newValue
});
답변
다음과 같이 before 값을 구독하는 방법이 있습니다.
this.myObservable = ko.observable();
this.myObservable.subscribe(function(previousValue){
//I'd like to get the previous value of 'myObservable' here before it's set to newValue
}, this, "beforeChange");
답변
ko.subscribable.fn.subscribeChanged = function (callback) {
var oldValue;
this.subscribe(function (_oldValue) {
oldValue = _oldValue;
}, this, 'beforeChange');
this.subscribe(function (newValue) {
callback(newValue, oldValue);
});
};
다음과 같이 위를 사용하십시오.
MyViewModel.MyObservableProperty.subscribeChanged(function (newValue, oldValue) {
});
답변
Beagle90 답변에 약간의 변화가 있습니다. 예를 들어 dispose ()에 액세스 할 수 있도록 항상 구독 자체를 반환합니다.
ko.subscribable.fn.subscribeChanged = function (callback) {
var oldValue;
this.subscribe(function (_oldValue) {
oldValue = _oldValue;
}, this, 'beforeChange');
var subscription = this.subscribe(function (newValue) {
callback(newValue, oldValue);
});
// always return subscription
return subscription;
};
답변
이 기능을 추가 하는 풀 요청 에는 beforeChange
이벤트 사용에 의존하는 것보다 더 나은 몇 가지 다른 코드가 있습니다.
Michael Best 의 솔루션에 대한 모든 크레딧
ko.subscribable.fn.subscribeChanged = function (callback) {
var savedValue = this.peek();
return this.subscribe(function (latestValue) {
var oldValue = savedValue;
savedValue = latestValue;
callback(latestValue, oldValue);
});
};
Michael을 인용하려면 :
나는 원래
beforeChange
문제를 해결하기 위해 을 했지만 항상 신뢰할 수있는 것은 아니라는 것을 깨달았습니다 (예 :valueHasMutated()
Observable 을 호출 하는 경우).
답변
쓰기 가능한 계산 된 Observable에서 peek ()를 호출하여 before 값을 얻을 수 있음을 발견했습니다.
다음과 같은 것 ( http://jsfiddle.net/4MUWp 참조 ) :
var enclosedObservable = ko.observable();
this.myObservable = ko.computed({
read: enclosedObservable,
write: function (newValue) {
var oldValue = enclosedObservable.peek();
alert(oldValue);
enclosedObservable(newValue);
}
});