2013-11-26 2 views
0

if 바인딩처럼 동작하는 사용자 지정 바인딩을 만들고 싶지만 요소를 완전히 제거하는 대신 제거해야 할 때마다 동일한 높이의 다른 요소로 바꿉니다.knockoutjs/shim binding

저는 해킹되지 않는 방법을 찾기 위해 고심하고 있습니다. 나는 교육적인 방법으로 이것에 대해 알아볼 수있는 녹아웃의 내부에 대해 충분히 알지 못합니다.

모든 포인터가 크게 감사하겠습니다.

감사합니다.

+0

당신이'결합하면하여 해결할 수 : CSS'과'[조건] : { shim : [condition]}'그리고 css에서 내용을 숨 깁니다 :'.shim {visibility : hidden}'? – sroes

+0

좋은 생각. 제거 할 때 제거 된 요소의 높이에'.shim '높이를 설정해야하므로 순수한 CSS 솔루션 이상이 필요합니다. – Finbarr

답변

1

당신이 쓸 수있는 자신의 바인딩 :

ko.bindingHandlers.shim = { 
    update: function(element, valueAccessor, allBindings) { 

     // First get the latest data that we're bound to 
     var value = valueAccessor(); 

     // Next, whether or not the supplied model property is observable, get its current value 
     var shim = ko.unwrap(value); 

     if (shim) { 
      var shimEl = $(element).data('shim'); 
      // Create the shim element if not created yet 
      if (!shimEl) { 
       shimEl = $('<div />').addClass('shim').appendTo(element); 
       // Equal the height of the elements 
       shimEl.height($(element).height()); 
       $(element).data('shim', shimEl); 
      } 
      shimEl.show(); 
     } else { 
      var shimEl = $(element).data('shim'); 
      if (shimEl) { 
       shimEl.hide(); 
      } 
     } 

     // You can also trigger the if-binding at this point 
     // ko.bindingHandlers.if.update(element, valueAccessor, allBindings); 
    } 
}; 

을 다음과 같이 사용 :

<div data-bind="shim: [condition]"></div> 
+0

아하 이것은 훌륭합니다. 'if'바인딩까지의 위임은 빠진 부분이었습니다. 감사! – Finbarr

+0

환영합니다 :) – sroes

+0

이 작업에 대한 몇 가지 노트. 'if' 바인딩은'init'도 필요합니다. 또한'valueAccessor'의 반대 값을'ko.bindingHandlers.if.update'에 대한 호출에서 함수로 전달해야합니다. 그렇지 않으면 솔루션이 완벽하게 작동하며 도움을 주셔서 감사합니다. – Finbarr