2013-03-01 32 views
17

Trong tay lái, nói rằng tôi có một bộ sưu tập của names làm thế nào tôi có thể làmtruy cập cho tay lái #each

{{#each names}} 
{{position}} 
{{name}} 
{{/each}} 

đó {{position}} là 1 tên đầu tiên, 2 cho tên thứ hai vv Làm Tôi hoàn toàn phải lưu trữ vị trí như một chìa khóa trong bộ sưu tập?

Trả lời

2

Trong khi bạn không thể thực hiện việc này với bất kỳ trình trợ giúp Handlebars gốc nào, bạn có thể tạo của riêng bạn. Bạn có thể gọi Handlebars.registerHelper(), chuyển cho nó một chuỗi có tên bạn muốn khớp (vị trí) và một hàm sẽ trả về số vị trí hiện tại. Bạn có thể theo dõi số vị trí trong phần đóng cửa nơi bạn gọi registerHelper. Dưới đây là một ví dụ về cách bạn có thể đăng ký một người trợ giúp được gọi là position mà nên làm việc với ví dụ mẫu của bạn.

JavaScript:

// Using a self-invoking function just to illustrate the closure 
(function() { 
    // Start at 1, name this unique to anything in this closure 
    var positionCounter = 1; 

    Handlebars.registerHelper('position', function() { 
     return positionCounter++; 
    }); 

    // Compile/render your template here 
    // It will use the helper whenever it seems position 
})(); 

Đây là một jsFiddle để chứng minh: http://jsfiddle.net/willslab/T5uKW/1/

Trong khi những người giúp đỡ được tài liệu trên handlebarsjs.com, điều này mất một số nỗ lực cho tôi để tìm hiểu làm thế nào để sử dụng chúng. Cảm ơn bạn đã thử thách và tôi hy vọng điều đó sẽ hữu ích!

+0

cố gắng thêm nhiều vị trí cùng lúc với div/block – Adrian

29

Bạn có thể làm điều này với built-in ký hiệu tay lái @index:

{{#each array}} 
    {{@index}}: {{this}} 
{{/each}} 

@index sẽ cung cấp cho các (zero-based) chỉ số của từng hạng mục trong mảng nhất định.

Xin lưu ý cho những người sử dụng Handlebars với công cụ xem Dao cạo, bạn phải sử dụng ký hiệu @@ index để tránh lỗi biên dịch.

Đối với built-in hơn những người giúp đỡ thấy http://handlebarsjs.com/

+1

@algorithmicCoder câu trả lời này có vẻ tốt với tôi. Nó làm việc cho bạn? Hãy chấp nhận nó nếu có, cho rõ ràng. Cảm ơn! –

+0

Điều này sẽ hiển thị "0" cho tên đầu tiên nhưng OP muốn hiển thị "1". Câu trả lời của serg đăng ký một người trợ giúp để cung cấp một giải pháp hoàn chỉnh hơn. – Vaughan

2

duy nhất bạn phải sử dụng {{}} @index

dụ:

{{#.}} 
<li class="order{{@index}}"> counter: {{@index}}</li> 
{{/.}} 
1

Đây là giải pháp ưa thích của tôi. Đăng ký một trình trợ giúp mở rộng ngữ cảnh để bao gồm thuộc tính vị trí của bạn tự động. Sau đó, chỉ cần sử dụng trình trợ giúp chặn mới của bạn (ví dụ: #iter) thay vì #each.

Handlebars.registerHelper('iter', function (context, options) { 
    var ret = ""; 

    for (var i = 0, j = context.length; i < j; i++) { 
     ret += options.fn($.extend(context[i], {position: i + 1})); 
    } 

    return ret; 
}); 

Cách sử dụng:

{{#iter names}} 
    {{position}} 
    {{name}} 
{{/iter}} 

chuyển thể từ http://rockycode.com/blog/handlebars-loop-index/

14
Handlebars.registerHelper("counter", function (index){ 
    return index + 1; 
}); 

Cách sử dụng:

{{#each names}} 
    {{counter @index}} 
    {{name}} 
{{/each}} 
0

bạn có thể nhận được giá trị chỉ từ chỉ mục bên trong danh sách.

{{#each list}} 
    @index 
{{/each}} 
+0

cách lấy độ dài của danh sách? –

+0

trường hợp sử dụng là gì? nếu bạn chỉ muốn lặp qua danh sách thì mỗi chức năng sẽ thực hiện công việc hoặc nếu bạn muốn áp dụng các hoạt động khác dựa trên độ dài thì chỉ cần đăng ký một hàm trợ giúp và trả về độ dài danh sách từ nó. cho tôi biết nếu bạn đang yêu cầu điều gì khác và tôi không thể hiểu hoặc bất kỳ truy vấn nào khác mà bạn có. –

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