2017-11-01 3 views
0

자바 스크립트 개체에 저장된 데이터를 기반으로 동적 XML을 만들려고합니다. 문제는 특정 속성에 대한 소스 데이터에 null이 포함되어있을 수 있으므로 Handlebars가 빈 문자열로 속성을 렌더링하게되는 반면 Handlebars는이를 무시하고 전혀 렌더링하지 않기를 바란다는 것입니다. 내가 이런 도우미와 템플릿을 만들 수있는 가정 :Handlebars.js는 소스 값이 null 인 렌더링 속성을 제외 시키십니까?

<item {{if id}}id={{id}}{{/if}}></item> 

을하지만 그것은 단지 많은 작업 같은 것, 그리고 모든 것을 읽을 수 있습니다. 동일한 결과를 얻는 더 좋은 방법이 있습니까? 또는 빈 문자열을 갖는 속성을 렌더링하고 삭제 한 후에 전체 XML을 트래버스하는 것이 더 좋은 방법일까요?

답변

1

매우 간단한 Handlebars helper을 만드는 것이 좋습니다. keyvalue을 매개 변수로 사용할 수 있지만 value0 또는 true 일 경우 형식이 지정된 속성 만 반환합니다. 예를 들어 :

Handlebars.registerHelper('attr', function (key, value) { 
    if (!Handlebars.Utils.isEmpty(value)) { 
     return new Handlebars.SafeString(key + '="' + Handlebars.escapeExpression(value) + '"'); 
    } 
}); 

템플릿이 다음과 같은 방식으로 도우미를 호출 할 것이다 :

<item {{attr 'id' id}}></item> 

참고 : 나는 그것이 인용 문자가 포함 된 경우를 대비 value의 탈출 HTML을 추가했습니다. 당신이 ES6를 사용할 수있는 경우

또한,하는 Template Literal이 예뻐 것 :

return new Handlebars.SafeString(`${key}="${Handlebars.escapeExpression(value)}"`); 

나는 당신의 참고를위한 fiddle을 만들었습니다.

+0

감사합니다. 깔끔하고 간단한 해결책 인 것 같습니다. – robertpaulsen

+0

필자는이 솔루션을 테스트했으며 작성한 바이올린에서 작동하지만 내 사이트에서는 작동하지 않습니다. 내 template.js 파일 내부의 속성이이 경우 "id"가 도우미에 의한 제외에 관계없이 반환되는 문자열의 일부이기 때문에 템플릿과 관련된 사전 컴파일과 관련 될 수 있는지 궁금합니다. . 미리 컴파일 된 것이 중요하다고 생각하십니까? – robertpaulsen

+0

@robertpaulsen : 프리 컴파일이 이것에 어떤 영향을 미칠지 상상할 수 없습니다. "... ... 관계없이 반환되는 문자열의 일부입니다 ..."라는 의미는 무엇입니까? – 76484

관련 문제