2013-03-21 1 views
2

내가 knockout.js의 사용자 지정 바인딩에 다음과 같은 동작으로 난처한 상황에 빠진하고있다 바인딩 :사용자 정의 valueAccessor 예상치 못한 결과

ko.bindingHandlers.customBinding = { 
    update: function(element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     console.log(JSON.stringify(value)); 
    } 
} 

ko.applyBindings({ 
    someText: ko.observable("inital value") 
}); 

<input type="text" data-bind="value: someText, customBinding: {some: 'option'}"> 

valueAccessor() 나에게보기 모델을 제공해야 속성 값 (즉, 관찰 가능 someText)에 바인딩 된 속성. 문서 인용하기 :

valueAccessor -이 바인딩과 관련된 현재 모델 속성을 가져 오기 위해 호출 할 수있는 JavaScript 함수입니다. 매개 변수를 전달하지 않고이 모델을 호출하면 (즉, valueAccessor()) 현재 모델 속성 값을 가져올 수 있습니다.

그러나, 정말, 즉 {some: 'option'} 바인딩 값을 반환 할 것입니다 않습니다 .

무엇이 누락 되었습니까?

http://jsfiddle.net/j5y8H/

답변

1

당신은 당신의 custombinding 호출에 valueAccessor을 위해 당신이 원하는 모델 속성을 전달해야 참조하십시오. 귀하의 경우에는, 당신이 모델의 속성을 원하는 'someText': 당신은 약간의 물건을 혼합하고 http://jsfiddle.net/j5y8H/1/

+1

아하이 봐요. 그건 의미가 있습니다. 예상했던대로 작동하지 않지만 'value'바인딩이 작동하는 방식과 일치합니다. 그것은 문서가 말하는 방법과 일관성이 없습니다. 'valueAccessor'는 바인딩에서 전달하고자하는 것은 무엇이든 상관 없으며 반드시 "현재 모델 속성"이 될 필요는 없습니다. 감사. – Tomalak

+0

예. 당신이 따라가는 다른 것들은 allBindingsAccessor에서부터 선택할 수 있습니다. 여기서 'source'라는 속성의 문자열을 전달하는 간단한 예제를 만들었습니다. http://jsfiddle.net/j5y8H/3/ (또는 Grim 포인트와 같은 'value'속성을 선택할 수 있습니다) –

1

<input type="text" data-bind="value: someText, customBinding: someText"> 

참조 일 - valueAccessor 매개 변수는이 바인딩의 값 에 액세스 할 수 있습니다 (당신이 이미 알았던 것처럼).

"값"바인딩은 사용자가 적용된 요소에 존재하지 않거나 전혀 유효하지 않은 다른 바인딩 (div 등) 일뿐입니다. 당신이 정말로 바인딩 (그리고 당신이 당신의 바인딩 핸들러를 재고 할 수 있습니다 할 경우 가장 가능성)에 바인딩 된 속성에 액세스하려면

, 당신처럼 allBindingsAccessor 매개 변수를 통해 수행 할 수 있습니다 그 :

ko.utils.unwrapObservable(allBindingsAccessor().value); 
+1

네, 저도 지금까지 그걸 발견했습니다. :-) 사실 나는 설명서에 오해되었거나 오해했습니다. 내 계획은 jQueryUI datepicker (예를 들어)를 생성하는 커스텀 바인딩을 만들고 그것을위한 옵션을 포함하는 바인딩에 객체를 삽입하고 싶습니다. 'template' 바인딩과 비슷합니다. – Tomalak

+0

jQuery datepicker workse는 어떻게 작동하는지 모르지만 일부 MooTools 날짜 선택기 애드온에 대해 비슷한 작업을 수행했습니다. 값 바인딩을 사용하지 않고 직접 처리기에서 값 업데이트 및 이벤트를 처리하는 것으로 나타났습니다. 훨씬 적은 두통. :) – Grim