2012-03-21 1 views
2

{{#each}}처럼 작동하는 핸들 막대 도우미를 만들고 싶지만 모든 n 반복 코드가 실행되도록 숫자를 지정할 수있는 가능성을 제공합니다.배열을 통한 패키지 반복

내가 필요한 이유는 세 항목의 행에 내용을 뿌려야하기 때문에 새 컨테이너 div를 열고 닫을 때마다 세 항목이 필요합니다.

단순히 백본 형식 세 항목의 패키지 배열을하자 {{#each}}를 사용하는 것을 반복 할 수 물론

하지만 난 내가 말할 수 있도록이 도우미를 만드는 데 더 우아한 것이라고 생각 뭔가

{{#each_pack data 3}} 
    <div class="container"> 
    {{#each pack_items}} 
    <span>{{content}}</span> 
    {{/each}} 
    </div> 
{{/each_pack}} 
같은

어떻게해야할지 모르겠습니다. pack_items을 내부 블록에서 사용하려면 어떻게해야합니까?

+0

내가 콧수염 구문거야 당신이 시도하고있는 무슨 편하지 수 있다고 생각하지 않습니다 다음은 코드입니다. 템플릿의 이런 종류의 _logic_을 옮기는 것이 패턴이라고 생각합니다. 이런 종류의 _meta attributes_를'Model'에 제공하기 위해서'Decorator'를 사용할 수 있습니다. 또는 모델에 [toJSONDecorated 메소드 추가] (http://stackoverflow.com/questions/9642439/computed-properties-in-backbone/9687672#9687672) – fguillen

+1

나는 항상 논리가없는 접근 방식을 강요하는 방법으로 더 많이 보았습니다. 배열을 반복하고 모듈로 연산자를 사용하여 새 행의 시작 여부를 확인하고 재사용 성 및 클리너 템플릿을 승격 시키며 모든 논리를 파트로 이동시키지 않는 것과 같이 템플리트에서 일반적으로 수행 할 일에 대한 헬퍼를 작성하십시오 데이터를 제공하는 응용 프로그램의 따라서 종종 발생하는 이런 종류의 상황에 도움을주는 아이디어. – TheShellfishMeme

답변

1

방금 ​​제안한 것과 똑같은 구문을 사용할 수 있도록이 문제를 해결했습니다.

window.Handlebars.registerHelper('each_pack', function(context, packsize, fn){ 
    var ret = ''; 

    /* 
     Function that creates packages of size 
     packsize from a given array 
    */ 
    var packagify = function(array, packsize){ 
     var i = 0; 
     var length = array.length; 

     var returnArray = []; 
     var pack = []; 
     while(i < length){ 
      /* 
       If this is not the first entry, 
       if this is the packsize-d entry 
       or this is the last entry, 
       push the pack to the return array 
       and create a new one 
      */ 

      if(((i % packsize) == 0 && i != 0) || (i == (length - 1))){ 
       returnArray.push(pack); 
       pack = []; 
      } 
      pack.push(array[i]); 
      i++; 
     } 
     return returnArray; 
    } 

    var packArray = packagify(context,packsize); 

    for(var i = 0; i < packArray.length; i++){ 
     var pack = packArray[i]; 

     this['pack_items'] = pack; 
     ret = ret + fn(this); 
    } 

    delete this['pack_items']; 
    return ret; 
}); 
+0

그래, 멋져 보이지만, [Underscore template] (http://documentcloud.github.com/underscore/#template)을 사용하고 있기 때문에 여전히 효과가 있습니다 .. 진짜가 아니므로 [콧수염 틀] (http : // 콧수염 .github.com/mustache.5.html). 세부 사항을 지적하고 싶다는 말은 잘못되었습니다. – fguillen