핸들 바 / 콧수염-객체의 속성을 반복하는 내장 된 방법이 있습니까?


216

질문의 제목에서 알 수 있듯이 콧수염 / 핸들 바로 객체 속성 을 반복하는 방법이 있습니까?

그래서

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
}

나는 무언가 할 수있는 템플릿 엔진 에 해당 할 것

for(var prop in o)
{
    // with say, prop a variable in the template and value the property value
}

?

답변:


448

핸들 바 1.0rc1부터 내장 지원

이 기능에 대한 지원이 Handlebars.js 에 추가 되었으므로 더 이상 외부 헬퍼가 필요하지 않습니다.

사용 방법

배열의 경우 :

{{#each myArray}}
    Index: {{@index}} Value = {{this}}
{{/each}}

객체의 경우 :

{{#each myObject}}
    Key: {{@key}} Value = {{this}}
{{/each}}

hasOwnProperty테스트를 통과 한 속성 만 열거됩니다.


2
@Rafi : 데이터 구조를 알지 못하면 그 의미를 이해할 수 없습니다.
Jon

3
@Rafi : {{this.title}}을 (를) 의미하지 않습니까?
nevyn

2
@qodeninja : 간단한 : 위의 예에서 값을 참조 같은 방법 -와 {{#each this}}. 선택한 용어는 혼동되기 때문에 (한 개체를 "최상위 수준"으로 만드는 것과 다른 개체가 아닌 "사전 정의 된"키가 아닌 다른 것 등) 혼동 될 수 있으므로 이러한 개념을 다시 방문 할 수 있습니다.
Jon

1
실수하지 않으면 v1.1.0에서만 사용할 수 있지만 큰 대답 덕분입니다.
Renars Sirotins

2
특정 속성의 화이트리스트에 대해서만 어떻게합니까?
Marco Prins

70

실제로 도우미로 구현하는 것은 매우 쉽습니다.

Handlebars.registerHelper('eachProperty', function(context, options) {
    var ret = "";
    for(var prop in context)
    {
        ret = ret + options.fn({property:prop,value:context[prop]});
    }
    return ret;
});

그런 다음 다음과 같이 사용하십시오.

{{#eachProperty object}}
    {{property}}: {{value}}<br/>
{{/eachProperty }}

2
좋아 보인다, 프로토 타입 속성을 반복하지 않도록 루프 안에 hasOwnProperty 검사를 추가해야합니까?
monkeyboy

훌륭한 솔루션 @ 벤. 누구든지 Ember와 함께 이것을 사용하려고하면 해결책을 얻으려면 아래의 대답을 참조하십시오.
flynfish

27

편집 : 핸들 바에는 이제이 작업을 수행하는 기본 제공 방법이 있습니다. 위 의 선택된 답변을 참조하십시오 . 일반 콧수염으로 작업 할 때 아래 사항이 여전히 적용됩니다.

콧수염은 배열의 항목을 반복 할 수 있습니다. 따라서 콧수염이 작동하는 방식으로 형식이 지정된 별도의 데이터 객체를 만드는 것이 좋습니다.

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };

for (var prop in o){
  if (o.hasOwnProperty(prop)){
    mustacheFormattedData['people'].push({
      'key' : prop,
      'value' : o[prop]
     });
  }
}

이제 콧수염 템플릿은 다음과 같습니다.

{{#people}}
  {{key}} : {{value}}
{{/people}}

https://github.com/janl/mustache.js에서 "비빈 목록"섹션을 확인하십시오.


1
어쨌든 추가 하위 속성을 전달해야하기 때문에 귀하의 제안으로 끝났습니다. 도와 주셔서 감사합니다!
Ben

정말 고마워요, 당신의 생각은 대안을 찾는 또 다른 날을 저를 구했습니다. 이 줄은 핵심 mustacheFormattedData = { 'people': []};
Matt

"o"객체 배열로 어떻게이 작업을 수행 하시겠습니까?
red888

4

이것은 Ember와 함께 사용하기 위해 업데이트 된 @ Ben의 대답입니다 ... Ember.getcontext가 String으로 전달되기 때문에 사용해야 합니다.

Ember.Handlebars.registerHelper('eachProperty', function(context, options) {
  var ret = "";
  var newContext = Ember.get(this, context);
  for(var prop in newContext)
  {
    if (newContext.hasOwnProperty(prop)) {
      ret = ret + options.fn({property:prop,value:newContext[prop]});
    }
  }
  return ret;
});

주형:

{{#eachProperty object}}
  {{key}}: {{value}}<br/>
{{/eachProperty }}

@flynfish 감사합니다. 컨텍스트는 Ember의 문자열입니까? 저것은 .. 다소 이상하다.
Ben

그래도 Ember를 처음 접하고 여전히 그 길을 찾으려고 노력하고 있기 때문에 확실하지 않습니다.
flynfish

1

@Amit의 대답은 Mustache와 Handlebars 모두에서 작동하기 때문에 좋습니다.

핸들 바 전용 솔루션에 관해서는 몇 가지를 보았 each_with_key으며 https://gist.github.com/1371586 의 블록 도우미 가 가장 좋습니다.

  • 객체 리터럴을 먼저 재구성하지 않고도 객체 리터럴을 반복 할 수 있습니다.
  • 키 변수를 제어 할 수 있습니다. 다른 많은 솔루션 'key'에서는 이름이 , 또는 'property'등의 객체 키를 사용할 때주의해야합니다 .

좋은 발견. 다른 독자들에게 경고 :이 요지의 "key_value"도우미에 버그가 있습니다. 수정 방법에 대한 의견을 읽으십시오.
sirentian

0

Ben의 솔루션에 감사드립니다. 사용 사례는 특정 필드 만 순서대로 표시합니다.

객체와 함께

암호:

    handlebars.registerHelper('eachToDisplayProperty', function(context, toDisplays, options) {
    var ret = "";
    var toDisplayKeyList = toDisplays.split(",");
    for(var i = 0; i < toDisplayKeyList.length; i++) {
        toDisplayKey = toDisplayKeyList[i];
        if(context[toDisplayKey]) {
            ret = ret + options.fn({
                property : toDisplayKey,
                value : context[toDisplayKey]
            });
        }

    }
    return ret;
});

소스 객체 :

   { locationDesc:"abc", name:"ghi", description:"def", four:"you wont see this"}

주형:

{{#eachToDisplayProperty this "locationDesc,description,name"}}
    <div>
        {{property}} --- {{value}}
    </div>
    {{/eachToDisplayProperty}}

산출:

locationDesc --- abc
description --- def
name --- ghi

0

이것은 데이터를 사전 형식화하지 않고 렌더링 중에 데이터를 가져 오지 않고 mustacheJS에 대한 헬퍼 기능입니다.

var data = {
    valueFromMap: function() {
        return function(text, render) {
            // "this" will be an object with map key property
            // text will be color that we have between the mustache-tags
            // in the template
            // render is the function that mustache gives us

            // still need to loop since we have no idea what the key is
            // but there will only be one
            for ( var key in this) {
                if (this.hasOwnProperty(key)) {
                    return render(this[key][text]);
                }
            }
        };
    },

    list: {
        blueHorse: {
            color: 'blue'
        },

        redHorse: {
            color: 'red'
        }
    }
};

주형:

{{#list}}
    {{#.}}<span>color: {{#valueFromMap}}color{{/valueFromMap}}</span> <br/>{{/.}}
{{/list}}

출력 :

color: blue
color: red

(순서가 임의 일 수 있습니다-지도 인 경우) 원하는지도 요소를 알고있는 경우 유용 할 수 있습니다. 잘못된 값만 조심하십시오.


-1

이전 버전 1.0.beta.6의 핸들 바를 사용하고 있었는데 1.1-1.3 중 어딘가에이 기능이 추가되었으므로 1.3.0으로 업데이트하면 문제가 해결되었습니다.

용법:

{{#each object}}
  Key {{@key}} : Value {{this}}
{{/people}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.