2012-10-31 27 views
19

Tôi đã bắt đầu sử dụng Handlebars.js. Dường như không có điều kiện xây dựng nào giống như nếu có. Tôi muốn có một cái gì đó như thế nàyhandlebar js trợ giúp tùy chỉnh cho người khác nếu

{{#if type.one }} 
    do something ... IF 
{{else if type.two}} 
    do something ... ELSE IF 
{{else}} 
    do something ... ELSE 
{{/if}} 

Nhưng điều này không hiệu quả. Làm thế nào để làm ELSE IF với tay lái? Việc viết trợ giúp tùy chỉnh có phải là lựa chọn duy nhất không? Nếu có thì vui lòng cung cấp một số gợi ý để viết trình trợ giúp này.

Trả lời

10

Vì Handlebars 3.0 cú pháp được mô tả bởi OP không hoạt động ra khỏi hộp! Xem: https://github.com/wycats/handlebars.js/pull/892 để biết thêm thông tin.

Lưu ý: Đối với Ember, kể từ phiên bản 1.10 trở lên, điều này cũng không hoạt động. Xem thêm: http://emberjs.com/blog/2015/02/07/ember-1-10-0-released.html#toc_chained-else-blocks

+1

này nên là câu trả lời 'mới' chấp nhận vào năm 2016. – Jeff

20

Bạn không thể thực hiện việc này với trình trợ giúp tùy chỉnh vì Người trợ giúp if-ish chỉ hiểu hai phần: phần "nếu" và phần "khác". Bạn có thể lồng những thứ mặc dù:

{{#if type.one}} 
    do something ... IF 
{{else}} 
    {{#if type.two}} 
     do something ... ELSE IF 
    {{else}} 
     {{#if type.three}} 
      ... 
     {{else}} 
      ... 
     {{/if}} 
    {{/if}} 
{{/if}} 

Điều đó sẽ nhanh chóng trở nên khó chịu do đó bạn có thể không muốn làm điều đó. Cách tiếp cận tốt hơn (như thường lệ với Handlebars) là đẩy logic vào JavaScript của bạn sao cho tối đa một trong số type.one, type.two, type.three, ... sẽ là đúng; sau đó bạn có thể:

{{#if type.one}} 
    ... 
{{/if}} 
{{#if type.two}} 
    ... 
{{/if}} 
{{#if type.three}} 
    ... 
{{/if}} 

Nếu bạn có rất nhiều lựa chọn cho type hoặc nếu các cơ quan trong {{#if}} của bạn rất phức tạp, bạn có thể chuyển sang partials. Bạn sẽ phải thêm một trình trợ giúp tùy chỉnh để xây dựng một tên một phần dựa trên biến mẫu mặc dù; một cái gì đó như thế này:

Handlebars.registerHelper('show_type', function(type) { 
    var types = ['one', 'two', 'three']; 
    var partial; 
    for(var i = 0; i < types.length; ++i) { 
     if(!type[types[i]]) 
      continue; 
     partial = '_partial_' + types[i]; 
     break; 
    } 
    if(partial) 
     return Handlebars.partials[name](this); 
    else 
     return ''; 
}); 

và sau đó, giả sử partials của bạn đều đã đăng ký và liên tục được đặt tên, bạn có thể nói:

{{show_type type}} 
1

Bạn có thể làm điều này:

{{#if type.one}} 
    ... 
{{else}} {{#if type.two}} 
    ... 
{{else}} {{#if type.three}} 
    ... 
{{else}} 
    ... 
{{/if}}{{/if}}{{/if}} 
0

Cú pháp chính xác mà OP đã viết sẽ hoạt động ở Ember Canary ngay hôm nay với cờ tính năng ember-htmlbars-inline-if-helper được bật.

1

Nếu bạn muốn có một hành vi chuyển đổi, bạn có thể quan tâm Dan Harper's helpers, bạn sẽ có thể làm điều gì đó như:

{{#is type 1}} 
    <p>Do something when 1.</p> 
{{else}}{{#is type 2}} 
    <p>Do something when 2.</p> 
{{else}}{{#is type 3}} 
    <p>Do something when 3.</p> 
{{/is}}{{/is}}{{/is}} 

Đây là jsfiddle.

Các vấn đề liên quan