동일한 옵저버 블 구독에서 옵저버 블의 이전 값 가져 오기


85

새로운 값을 받기 전에 해당 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
});

답변:


88

다음과 같이 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");

this여기서는 무엇을 의미합니까?
Thanasis Ioannidis

151
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) {

});

2
녹아웃에 대해 상당히 새로운 것이지만 이것이 기본 구독이 설정된 방식이기를 바랍니다. 아니면 ..이 fn은 내가 처음으로 '구독'을 사용할 때 적어도 첫 번째 가려움증을 긁을 것입니다.
bkwdesign 2013

1
github.com/knockout/knockout/issues/914 에서 이에 대한 약간의 움직임이 있습니다 . 3.4 릴리스가 예정되어있는 것 같습니다.
AlignedDev 2015 년

2
구독 된 관찰 가능 값 유형이 Array 인 경우 슬라이스해야합니다. 그렇지 않으면 oldValue가 항상 newValue와 동일합니다. 여기에, 작업 예제를 확인 : jsfiddle.net/david_freire/xmk6u9yn/4
데이비드 프레 이레


아 방금 git 대화를 봤어.
Michael

21

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;
};

2
이것은 실제 단계까지이지만, 호출 .dispose에만 처분 번째 가입이에서 반환 값에 것 아닌 'beforeChange'가입
TRManderson

18

이 기능을 추가 하는 풀 요청 에는 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 을 호출 하는 경우).


3

쓰기 가능한 계산 된 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);
    }
});

1
불행히도 구독 콜백이 호출 될 때 값이 이미 변경 peek()되어 새 값을 제공 하기 때문에 작동하지 않습니다 .
Michael Teper 2014 년

@MichaelTeper 나는 1 년 전에 내 답변을 게시 한 것을 알고 있지만, 몇 가지 반대표를 얻은 후에 방금 테스트했고 작동합니다. 참조 : jsfiddle.net/4MUWp이
rjmunro

Ok 나는 당신이 거기에서 무엇을했는지 봅니다. 질문은 subscribepeek ()로 할 수없는 콜백 에서 값을 검색하는 것에 관한 것이 었습니다 . 귀하의 예는 아무것도 증명하지 않으며 신규 이민자를 혼동시킬 수 있습니다. 기본적으로 여기에 private 변수를 래핑하고 설정하기 전에 값을 표시하므로 물론 변경되지 않습니다.
Simon_Weaver 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.