2010-12-29 7 views
2

큰 viewModel이 있고 전체 모델을 게시하지 않고 상태 업데이트 ("읽음"/ "읽지 않음")를 서버에 게시하고 싶습니다. 템플릿에서맞춤 바인딩을 사용하는 방법은 무엇입니까?

ko.bindingHandlers.statusUpdater = { 
    update: function(element, valueAccessor) { 
     console.log(element); 
    } 
}; 

: 내가 무슨 짓을했는지

은과 같이 사용자 지정 바인딩을 만들 수있는 사용자 지정 바인딩에 대한

<div data-bind='template: { name: "contactsListTemplate", data: viewModel.conversations.conversationlist }'> </div> 

<script type="text/html" id="contactsListTemplate"> 
<table> 
    <tbody> 
    {{each(i, conversation) $data}} 
    <tr> 
    <td> 
     <input type="checkbox" data-bind="checked: read, statusUpdater: conversation_id" /> 
    </td> 
    </tr> 
    {{/each}} 
    </tbody> 
</table> 
</script> 

, 나는, 업데이트에만 관심이있어 내가 내가 할 수있는 생각은 KnockoutJS로 업데이트를 탐지하고 아이템 ID와 새로운 통계를 가져 와서 서버에 게시 할 수 있도록 업데이트 된 아이템을 결정하는 것입니다.

customBinding은 console.log 하나의 체크 상자 수정시 모든 단일 체크 상자에 표시됩니다. 즉, 체크 박스를 변경하면 콘솔에 3 개의 확인란 모두가 ko.bindingHandlers.statusUpdater을 통해 로깅됩니다.

데이터 바인딩에 클릭 이벤트를 추가하는 것에 대해 생각했지만 사용자 정의 바인딩처럼 깨끗하지 않은 것으로 보입니다. 아마도 사용자 지정 바인딩을 사용하여 수행하려는 작업이 아닌가?

생각하십니까?

답변

4

init 메소드가 호출 된 후 모델 값이 업데이트 될 때마다 업데이트 메소드가 호출되고 시작시에 호출되기 때문에 그 이유가 그 때문입니다.

업데이트 바인딩 메서드는 뷰 모델이 변경 될 때 바인딩 된 dom 요소의 상태를 설정하기위한 것입니다.

변경 사항에 대응하고 viewModel을 업데이트하려면 init 메소드를 구현하고 이벤트를 첨부해야합니다 (클릭, 변경 등).이 핸들러에서 상태 업데이트를 viewmodel로 보낼 수 있습니다.

내가 배운 가장 좋은 방법은 git에서 KO의 디버그 버전을 살펴 보는 것입니다. 달성하고자하는 것은 기본적으로 ajax 호출로 수정 된 체크 바인딩입니다.

위 테스트를 실시하지 않았지만 시작해야합니다.

건배,

이안

+0

이 주셔서 감사하지만 뷰가 나는이 물건을 knockoutjs 아직 점들을 연결 수없는 것 ""= 데이터 바인드 내부 같을 것이다. 감사 – AnApprentice