2017-09-22 7 views
0

Ember 어플 리케이션을위한 새로운 조건부 도우미를 빌드하려고합니다. 중요한 것은 Ember 1.10.1에서 Handlebars 2.0을 사용하고 있는데 업그레이드 할 수 없다는 것이 Ember의이 버전의 문제를 해결하는 데 큰 도움이된다는 것입니다. 여기에 글을 쓰기 전에 다른 솔루션을 시도하고 Ember 코드를 많이 디버깅했습니다. 솔루션에 가깝지만 뭔가 빠졌습니다.조건부 Ember 도우미 작성

Ember.Handlebars.registerHelper('helperName', function(conditional, options) { 
    if(conditional) { 
     return options.fn(this); 
    } else { 
     return options.inverse(this); 
    } 
}); 

그리고 여기 템플릿 :

{{#helperName booleanCondition}} 
    print true 
{{else}} 
    print false 
{{/helperName}} 

모두가 fn 함수를 호출 잘 작동하지만 inversion 기능 (모든

첫째, 나는 다음과 같은 접근 방식은 핸들 설명서를 읽는 시도 else 브랜치의 템플릿을 렌더링하는 데 사용됨)는 실제로 함수가 아닌 객체였습니다.

는 다음 나는 엠버 코드를 디버깅을 시작하고 난 엠버가 if 도우미와 함께 사용하는 것과 동일한 접근 방식을 따르려고, 그래서 나는 다음과 같이 결국 :

Ember.Handlebars.registerHelper('helperName', function(condition, options) { 

    var permission = Ember.Object.extend({ 
     can: Ember.computed(function() { 
      return condition; 
     }) 
    }).create(); 

    Ember.Handlebars.helpers.boundIf.helperFunction.call(this, ["can"], permission, options, options.data.buffer); 
}); 

can이 경우에 바인딩 된 속성입니다 , 속성이 변경되면 템플릿을 변경하는 데 사용됩니다. 이는 boundIf 버전 인 if (방금 말한 것)을 사용하고 있기 때문입니다.

imho가 가장 정확할 수있는이 솔루션의 문제점은 속성이 올바르게 계산되지 않고 도우미가 항상 false 값을 인쇄한다는 것입니다. 나는 정말 많은 일을하지 않고 디버깅을했기 때문에 어떤 도움을 주시면 매우 감사하겠습니다. 다른 사람에게도 유용 할 수 있기를 바랍니다.

답변

0

좋은 소식은 Ember 1.10입니다! 이것은 서브 표현식이 있음을 의미합니다. 그리고 자사의 결합이 아닌 블록 도우미 만들 간단합니다 : 당신이 할하려는 것은 빌드가

{{#if (foo model)}} 
    in if 
{{else}} 
    in else 
{{/if}} 
+0

시도해 봤지만'TypeError : key.indexOf는 함수가 아닙니다 .' 이외에는 핸들 바를 사용하여 문제를 해결하고 싶습니다. HTMLBars가 아니지만 답변에 많은 감사를드립니다! – AndreaScn

+0

핸들 바가 없습니다. Ember는 '1.10' AFAIK에서 HTMLBars로 옮겼습니다. 당신은 결코 둘 다! 그리고 당신의 실수는 도움이되지 않습니다. 아마도 당신의 도우미와 함께 뭔가 잘못되었거나 코드의 다른 부분 일 것입니다. 위의 코드를 시도했습니다. – Lux

1

경우 :

Ember.HTMLBars._registerHelper('foo', function(bar) { 
    return bar == 'bar'; 
}); 

{{#if}} 도우미와 결합 블록 도우미로 사용하기를 권한 질문을 지원하는 조건부 접근 방식 인 경우 ember-can을 살펴 봐야합니다. 그것은 Ember-CLI 애드온이지만 (전역을 수행하는 것처럼 보이지만) 이전 버전은 Ember 1.10에서 작동했습니다. 당신은 그들이 무엇을하는지 참조 할 수 있어야하고 당신의 설정에서 그것을 끌어 들일 수 있어야합니다.