2014-09-29 3 views
1

동적으로로드되는 녹아웃 구성 요소를 사용하는 SPA가 있습니다. 여기 녹아웃 3.2 - AMD로드 된 구성 요소 간의 'if'기반 전환

는 현재

 <!-- ko if: state() === 'one' --> 
     <component-one></component-one> 
     <!-- /ko --> 

     <!-- ko if: state() === 'two' --> 
     <component-two></component-two> 
     <!-- /ko --> 

     <!-- ko if: state() === 'three' --> 
     <component-three params="myParam: MyParam()"></component-three> 
     <!-- /ko --> 

     <!-- ko if: state() === 'four' --> 
     <component-four></component-four> 
     <!-- /ko --> 

모습입니다 내가 찾고 가상 요소 바인딩 if와 동일한 결과를 생성 뭔가뿐만 아니라,/나를 전환 (페이드 배치 할 수 있습니다 아웃).

나는 녹아웃 2.1에서는 작동하지만 3.2에서는 작동하지 않는 것으로 보이는 http://jsfiddle.net/rniemeyer/kNtdu/과 같은 것을 발견했습니다.

참고 : fadeVisible은 아니지만 fadeIf 줄을 더 많이 찾습니다.

도움 주셔서 감사합니다.

답변

3

다음은 바인딩을 한 것입니다. 행동

ko.bindingHandlers.ifFading = { 
    init: function(element, valueAccessor, ignored1, ignored2, bindingContext) { 
     var template = $(ko.virtualElements.childNodes(element)).filter("*").clone(), 
      lastValue = false; 
     ko.virtualElements.emptyNode(element); 

     ko.computed(function() { 
      var dataValue = !!ko.unwrap(valueAccessor()); 
      if (dataValue !== lastValue) { 
       lastValue = dataValue; 
       if (dataValue) { 
        var templateClone = template.clone(); 
        ko.virtualElements.setDomNodeChildren(element, templateClone); 
        templateClone.hide(); 
        ko.applyBindingsToDescendants(bindingContext, element); 
        templateClone.fadeIn(); 
       } else { 
        $(ko.virtualElements.childNodes(element)).fadeOut(function() { 
         ko.virtualElements.emptyNode(element); 
        }); 
       } 
      } 
     }, null, { disposeWhenNodeIsRemoved: element }); 

     return { controlsDescendantBindings: true }; 
    } 
}; 
ko.virtualElements.allowedBindings.ifFading = true; 

: http://jsfiddle.net/mbest/6tpn5uhy/1/

+0

이 나를 위해 완벽하게 작동 : http://jsfiddle.net/mbest/6tpn5uhy/

여기 fadeOut를 사용하지 않는 간단한 버전입니다. 당신의 도움을 주셔서 감사합니다. 대답의 스 니펫 끝에있는 allowedBindings.ifSliding 대신 allowedBindings.ifFading을 읽어야합니다. templateClone.delay (400) .fadeIn();에 지연을 추가했습니다. 겹쳐지는 요소들을 멈추기 위해서. – Dom

+0

개선 사항 - 필자는 필요할 때 구성 요소를 가져 오는 requirejs를 사용하므로 구성 요소의 첫 번째로드에는 구성 요소가로드되기 전에 요소가 사라져 약간의 대기 시간을 갖기 때문에 구성 요소가 팝업됩니다. 자식 요소가 완전히 바인딩 된 후에? – Dom

+1

이 바인딩이 구성 요소가로드 된시기를 알 수있는 방법이 없습니다. 대신, 컴포넌트 템플리트 내에 fade-in 로직을 포함하거나 컴포넌트를 사전로드해야합니다. –

관련 문제