2016-12-29 8 views
1

(실제 변경 후) get the new value of an observable in a subscribe event에 대한 해결책이 있지만 "beforeChange"구독에서 관찰 가능 항목의 새 값에 액세스 할 수 있는지 궁금합니다."beforeChange"구독에서 관찰 가능 항목의 새 값 얻기

if (computedObservable.isDifferent(state.latestValue, newValue)) { 
    if (!state.isSleeping) { 
     computedObservable["notifySubscribers"](state.latestValue, "beforeChange"); 
    } 

    state.latestValue = newValue; 
    if (DEBUG) computedObservable._latestValue = newValue; 

    if (state.isSleeping) { 
     computedObservable.updateVersion(); 
    } else if (notifyChange) { 
     computedObservable["notifySubscribers"](state.latestValue); 
    } 

    changed = true; 
} 

분명히 NEWVALUE는 "beforeChange"에서 확인할 수 있도록 : 아래

current version of Knockout (3.4.1)의 조각 이전 값과 각각 새 값으로 beforeChange 및 afterChange 가입 핸들러를 제기하다 나는 포크가 옵션 일 것이라고 생각하지만, 나는 그렇게하지 않는 것을 좋아한다.

"beforeChange"라는 새로운 값을 얻는 다른 해결책이 있습니까?

+0

설정하기 전에 새로운 값을 가져 오는 이유에 대해 자세히 설명해 주실 수 있습니까? –

+0

@MichaelBest 나는 FOUC를 막으려 고하고 있습니다. 실제로 값을 설정하기 전에 새 값을 읽을 수 있으면 뷰의 원하지 않는 중간 렌더링을 방지하기 위해 다른 상태를 업데이트 할 수 있습니다. –

+0

계산 또는 구독을 사용하여 다음과 같이 사용할 수있는 두 번째 관찰 가능 항목을 업데이트 할 수 있어야합니다. 숨기기/표시/스타일. 예 : https://jsfiddle.net/dmnqoc53/ – user3297291

답변

1

참고 분기보다 더 나은 생각 :이 답변은 질문이 아니라 원래의 질문에 대한 귀하의 의견을 기반으로합니다.

관찰 가능이 변경되면이라는 관찰 가능 개체의 메서드를 호출합니다.이 메서드는 실제 알림을 보내고 해당 관찰 가능 개체에 의존하는 계산 된 관찰 가능 개체, 바인딩 등을 업데이트합니다. 이러한 알림 전에 작업을 수행하려면 몇 가지 옵션이 있습니다.

  1. 마찬가지로 @ user3297291은 Ryan Niemeyer의 protectedObservable을 사용합니다.

  2. 다른 구독자가 구독하기 전에 즉시 관측 가능 콘텐츠를 구독하십시오. 구독자는 항상 순서대로 호출되므로 코드는 항상 앞에 실행됩니다.

  3. notifySubscribers을 오버라이드하여 알림 프로세스에 연결하십시오 (이전 방법을 기억하십시오).

  4. 아마도 녹아웃 3.5.0의 경우 change 이벤트 전에 발생하는 a spectate event이있을 수 있습니다.

1

편집 : 난 그냥 질문을 다시 읽고 당신은 아마 당신이 설정되어 전에 새 값 확인 할 의미가 생각? 그렇다면 this과 같은 작업을 수행하는 것이 좋습니다. 지금 당신이 만약 돈을

var myObs = ko.observable(1); 
 

 
// Keep track of old 
 
var myObsOld = myObs(); 
 
myObs.subscribe(function(oldVal) { 
 
    myObsOld = oldVal; 
 
}, null, "beforeChange"); 
 

 
// Subscribe to new 
 
myObs.subscribe(function(newVal) { 
 
    console.log("myObs changed from", myObsOld, "to", newVal); 
 
}); 
 

 
myObs(2); 
 
myObs(3);
.as-console-wrapper { min-height: 100%; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

:


나는 보통 (당신은 아마 이미 시도했습니다) 이전의 트랙을 유지하기 위해 두 개의 구독 및 여분의 변수를 생성 추가 변수와 구독으로 뷰 모델을 낭비하지 않으려면이 논리를 확장자로 캡슐화 할 수 있습니다.

ko.extenders.latestValue = function(target, option) { 
 
    target.latestValue = target(); 
 
    
 
    target.subscribe(function(oldVal) { 
 
    target.latestValue = oldVal; 
 
    }, null, "beforeChange"); 
 
    
 
    return target; 
 
}; 
 

 
var myObs2 = ko.observable("a").extend({ latestValue: true }); 
 
myObs2.subscribe(function(newVal) { 
 
    console.log("myObs2 changed from", myObs2.latestValue, "to", newVal); 
 
}); 
 

 
myObs2("b"); 
 
myObs2("c");
.as-console-wrapper { min-height: 100%; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

아니 아주 섹시한 접근하지만, 나는 그것이 REPO :

+0

답변 해 주셔서 감사합니다. 사실, 내 문제는 실제로 변경하기 전에 새로운 값을 검색하고, 변경 한 후에는 이전 값을 검색하지 않는 것이 었습니다. 관찰 가능한 모습을 감추고있는 것은 무엇입니까? 그것을 구독하는 방법?. –