2012-12-24 2 views
5

jQuery 위젯을 래퍼로 사용하는 녹아웃 바인딩을 만들고 있습니다. 이 위젯은 이벤트 핸들러를 하위 요소에 적용합니다. 불행히도 위젯의 이벤트 처리는 위임되지 않은 자식 요소에 직접 적용됩니다. 문제는 내가 동일한 요소에 foreach 바인딩을 가지고 있지만,foreach 바인딩이 적용된 후에 사용자 정의 바인딩이 에 적용되어야합니다.녹아웃 바인딩이 적용되는 순서 변경

분명히 올바른 것은 jQuery 플러그인을 수정하는 것이지만 현재로서는이 옵션이 아닙니다. 나에게 좋은 대안이 있는지 궁금 하네. 예를 들어 다음 중 하나를 수행하는 방법이 있습니까?

  1. 특정 바인딩
  2. 안전하게 다른 장소를

업데이트 취할 구속력 응용 프로그램

  • 바인딩의 순서에 영향을 미칠 적용되었는지 여부를 감지 :

    한 측면을 I 이 사용자 정의와 foreach 바인딩이 템플릿에 있어야한다는 점을 언급해야합니다. 따라서 DOM을 직접 수정하는 솔루션은 템플릿을 실제로 수정하므로 나에게 적합하지 않습니다.

  • 답변

    2

    바인딩이 foreach 바인딩에 종속되어있는 경우 사용자 지정 바인딩에서 바인딩을 호출하는 것이 좋습니다. 그런 다음 데이터 바인드 속성에 제공 할 필요조차 없습니다. 나는 의존성의 배열로 bindingHandler에 재산 후 추가

    http://jsfiddle.net/w9bsc/42/

    ko.applyBindingsToNode(element, { options: valueAccessor(), optionsCaption: caption, optionsText: optionsText }, viewModel); 
    
    +0

    답변 해 주셔서 감사합니다. 실제로 (applyBindingsToNode'를 사용하여) 당신이 한 것을 시도해 보았습니다. 이전에 언급하지 못한 한 가지 복잡한 점은 내 custom binding이'text/html' 템플릿에 적용된다는 것입니다. 'foreach'로'applyBindingsToNode'를 한 후에, 자식 노드가 생성되었지만, 템플릿 인스턴스의 DOM이 아니라, 템플릿의 DOM에 영구히 삽입되었습니다. – Jacob

    +0

    당신은 foreach가 아니라 그것을위한 템플릿 바인딩을 사용해야합니다. – Anders

    +0

    나는 둘 다 시도했다. 어쨌든,'applyBindingsToNode'는 템플리트의 내부에서 DOM을 변형 시켰습니다. – Jacob

    2

    해결 방법을 찾았지만, 내가 좋아하는 것보다 더 많은 해킹입니다. 나는 더 나은 대답을 기다릴 것입니다.

    은 내가 한 일은 단순히이 있었다 :
    ko.bindingHandlers.myHandler = { 
        init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         if (allBindingsAccessor().foreach) { 
          setTimeout(doInit, 1); 
         } else { 
          doInit(); 
         } 
    
         function doInit() { 
          bindingContext.initializedMyHandler = true; 
          // Actual code 
         } 
        }, 
        update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         if (bindingContext.initializedMyHandler) { 
          doUpdate(); 
         } else { 
          setTimeout(doUpdate, 1); 
         } 
         function doUpdate() { 
          // Actual code 
         } 
        } 
    }; 
    

    는 기본적으로 난 그냥 타임 아웃을 사용하여 실행을 연기. 그러면 나머지 바인딩 핸들러가 먼저 실행됩니다.

    7

    바인딩 정의 내에서 바인딩 옵션을 호출하는 방법을 확인, 다른 날 다른 SO 사용자에게 도움이

    ko.bindingHandlers.myHandler = { 
        init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         // Actual code 
        }, 
        update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
         // Actual code 
        }, 
        after:['foreach'] 
    }; 
    
    +0

    이것이 작동하지 않는 것 같습니다 - 일부 문서에 대한 링크가 있거나 작동중인 모습을 보여주는 피델 (fiddle)이 있습니까? –

    +1

    [예] (http://jsfiddle.net/2uaLxdrk/8/) – DrSammyD

    +0

    흥미 롭습니다 - 감사합니다. 물론 그것은 녹아웃 코드에 있습니다. 내가 그것을 시도했을 때 그것이 효과가 없었던 이유를 명확히하지 않고있다. –

    관련 문제