옵저버 블에서 자동으로 트리거하지 않고 뷰 새로 고침을 수행하는 방법은 무엇입니까?


151

참고 : 이것은 대부분 KnockoutJS를 디버깅하고 이해하기위한 것입니다.

(이미 바운드 된) 뷰 모델에서 뷰를 새로 고치도록 Knockout을 명시 적으로 요청하는 방법이 있습니까? 나는 다음과 같은 것을 찾고있다 :

ko.refreshView();

나는 이것이 녹아웃을 의도 한 것이 아니라는 것을 이해하지만 디버깅 및 학습 목적으로 그러한 방법이 있는지 알고 싶습니다.

답변:


252

전체 viewModel에서 무언가를 호출 할 수는 없지만 관찰 가능한 개별 개체에서 myObservable.valueHasMutated()가입자에게 재평가해야한다는 사실을 알리기 위해 호출 할 수 있습니다 . 언급 한 것처럼 KO에서는 일반적으로 필요하지 않습니다.


5
또한 데이터 컨텍스트를 반복하여 valueHasMutated유형 의 속성 을 가진 요소를 검색하고 각 요소 function에 대해이를 호출 할 수 있습니다. 그것은 모든 관측 가능 항목을 가져와야하지만 나쁜 습관이며 예상보다 훨씬 많은 업데이트를 발생시킬 수 있습니다 (계산 된 종속성 체인을 생각하십시오).
Patrick M

크롬에서 테스트하면 다른 것이 없다면 좋을 것입니다.
Scott Romack

viewModel 자체는 관찰 가능할 수 있으므로 myViewModel.valueHasMutated()전체 뷰를 업데이트하기 위해 호출 할 수 있습니다.
Roy J

2
여기에서도 배열에서 작동하지 않습니다. 실제로 배열은 녹아웃에서 전혀 작동하지 않는 것 같습니다. 나는 Angular를 그리워한다 :-(
garryp

2
그것은 KO 3.5로 KnockoutObservableArrays에 대한 작업을 수행
발린

25

경우에 따라 바인딩을 제거한 다음 다시 적용하는 것이 유용 할 수 있습니다.

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

편집 ebram 주셔서 감사합니다 ... 나는 ;-) 내가 커피 스크립트를 사용하여 언급 했어야 추측
ProfNimrod

15
cleanNode가 다른 DOM 이벤트도 제거하므로 jQuery도 사용하는지 (예 : 앱의 비트를 ko로 마이그레이션 할 때) 살펴보십시오.
Dan Revell

이것은 완벽 해요. 뷰 모델이 적용된 후에 KO가 데이터 바인딩 속성을 가진 새로운 dom 어린이를 인식하도록 할 수 없습니다.
Andrew T Finnell

완전한! 일!
jeff_drumgod

0

내 bindHTML knockout 바인딩 핸들러로 JSFiddle을 만들었습니다 : https://jsfiddle.net/glaivier/9859uq8t/

먼저 바인딩 핸들러를 자체 (또는 공통) 파일에 저장하고 녹아웃 후 포함합니다.

이것을 사용하면 바인딩을 이것으로 전환하십시오 :

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.