2012-02-01 1 views
3

핸들을 JSON 객체를 반복 할 수 있도록 핸들러에 등록하려고합니다. This gist은 적절한 해결책으로 보입니다. 나는 그것을 다음 CoffeeScript로 변환했다. 내가 도우미 중 하나 (바닐라 자바 ​​스크립트와 CoffeeScript 버전 모두에 해당)를 사용할 때 아무 일도 일어나지 않는 것 같습니다. 어떤 아이디어? 템플릿에서 핸들 바를 사용하여 javascript 객체 반복하기

$ -> 
    Handlebars.registerHelper "key_value", (obj, fn)-> 
    buffer = "" 
    key 
    for key in obj 
     if obj.hasOwnProperty(key) 
     buffer += fn({key: key, value: obj[key]}) 
    buffer 

    Handlebars.registerHelper "each_with_key", (obj, fn)-> 
    context 
    buffer = "" 
    key 
    keyName = fn.hash.key 
    for key in obj 
     if obj.hasOwnProperty(key) 
     context = obj[key] 
     if keyName 
      context[keyName] = key 
      buffer += fn(context) 
    buffer 

: 나는 현재 레일 응용 프로그램에 핸들을 추가 Gemfile에 gem 'handlebars-assets'을 사용하고

{{#key_value categories}} 
I'M ALIVE!! 
{{/key_value}} 

{{#each_with_key categories key="category_id"}} 
I'M ALIVE!! 
{{/each_with_key}} 

.

답변

7

JavaScript가 CoffeeScript 음역에 어긋납니다. 당신은 커피 스크립트에서 객체를 반복하는 for ... in를 사용하지 않는, 당신은 for k, v of ...을 사용

사용 of 대신 배열에있는 값의 객체의 속성 이해를 알리기 위해.

이 커피 스크립트 루프 :

for (_i = 0, _len = y.length; _i < _len; _i++) { 
    x = a[_i]; 
    ... 
} 

그래서 y이 객체가 length 재산 않고있는 경우, 다음 _lenundefined되며 자바 스크립트 for(;;) 루프 원 :

for x in y 
    ... 

이 자바 스크립트가됩니다 전혀 반복하지 마라. 당신이 interited 할 수있다 속성을 피하기 위해 hasOwnProperty 검사를 추가하여, 객체 자체에 정의 바로 키를 반복하려는 경우

:

또한 own 대신 hasOwnProperty를 사용한다 프로토 타입에서 for own key, value of object을 사용하십시오.

그러나 이는 정확성보다는 편의를위한 것입니다. expr 하나 이상의 행 또는 읽을 수있는 이해를 허용하는 데 시간이 너무 오래입니다

array = for own k, v in o 
    expr 

경우 :

또한, 커피 스크립트 루프는 표현은 일반적으로 array = expr for own k, v in o을 말할 것 때문에 또는 해당하는 형태이다.

커피 스크립트에 도우미의 정확하고 더 관용적 버전은 더 같을 것이다 :

Handlebars.registerHelper "key_value", (obj, fn)-> 
    (fn(key: key, value: value) for own key, value of obj).join('') 

Handlebars.registerHelper "each_with_key", (obj, fn)-> 
    key_name = fn.hash.key 
    buffer = for own key, value of obj 
     value[key_name] = key 
     fn(value) 
    buffer.join('') 

데모 : http://jsfiddle.net/ambiguous/LWTPv/