2012-08-03 2 views
1

그래서이 질문은 내 앞의 질문을 몇 가지 조사 후 Under what conditions does a Knockout native template re-renderafterRender 템플릿 호출이 computedObservables로 실행되는 것 같습니다. 왜, 어떻게 고쳐야합니까?

에서에 다음, 그것은 보인다 템플릿이 afterRender 함수를 정의하고 모델의 일부가 연속적으로 변경되는 경우 그 afterRender 기능은 다음 일부 모델을 참조하는 경우, afterRender 함수가 다시 호출됩니다.

이 문제는 그 다음에 따라 달라 모델의 부품 녹아웃 트랙이 어디 변경에 따라 값의 computedObservables 때마다 하나를 다시 실행 computedObservables (일명 dependentObservables)과 비슷한 것 같다.

이는 내가 jsFiddle를 작성했습니다 보여주기 위해 : http://jsfiddle.net/unklefolk/nczCt/1/ 뷰가 렌더링 될 때 호출되는 afterRender 기능을 예상대로

. 그러나 확인란을 클릭하면 afterRender 함수가 다시 실행됩니다. viewModel.selectedPet().pet().IsHappy()

이것은 내게 의미가 없습니다. 그래서 제 질문은 :

  • 이이 afterRender 기능이 다시 실행되는 버그인가?
  • afterRender 기능이 한 번만 실행되도록하려면 어떻게해야합니까?

미리 감사드립니다.

답변

3

녹아웃은 계산 된 관찰 가능을 사용하여 요소의 바인딩 실행을 래핑합니다. 이 종속성 변경 (이 link 더 설명 할 수있는 다시 때 바인딩이 트리거되는 방법이다. 현재

afterRender 코드가 이러한 종속성에 추가에서 제외되지 않습니다.이 시나리오에 대한 바람직하지 않은 경우가있다 몇 가지 방법은 그것을 방지하기 위해

  • setTimeout에서 코드를 실행합니다. http://jsfiddle.net/rniemeyer/nczCt/3/ (나는 피하기 위해 지금 이런 짓을 했을까 : http://jsfiddle.net/rniemeyer/nczCt/2/
  • 같이 즉시 폐기하는 것이 자신의 계산 된 관찰에 코드를 랩처럼 the setTimeout)
  • KO 2.2에서는 종속성을 만들지 않고 값을 얻을 수있는 observables에 새로운 peek 함수를 사용할 수 있습니다.
+0

환상적인 답변입니다. 고마워, 라이언. KO 2.2 기대. –

관련 문제