Ria mép có thể lặp lại một mảng cấp cao nhất không?


109

Đối tượng của tôi trông như thế này:

['foo','bar','baz']

Và tôi muốn sử dụng một mẫu ria mép để tạo ra từ nó một cái gì đó như thế này:

"<ul><li>foo</li><li>bar</li><li>baz</li></ul>"

Nhưng bằng cách nào? Tôi có thực sự phải biến nó thành một thứ như thế này trước không?

{list:['foo','bar','baz']}

Câu trả lời:


169

Bạn có thể làm như thế này ...

Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>', ['foo','bar','baz']);

Nó cũng hoạt động cho những thứ như thế này ...

var obj = [{name: 'foo'}, {name: 'bar'}];
var tmp = '<ul>{{#.}}<li>{{name}}</li>{{/.}}</ul>';
Mustache.render(tmp, obj);

2
thực sự thì mẫu có trước: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver

Làm cách nào để lấy, ví dụ, phần tử thứ 2 của mảng? Tôi đang cố gắng thực hiện {{.1}} với mustache.js và nó không hoạt động.
thouliha

NM, đã tìm ra: bạn có thể bỏ qua các dấu chấm: vậy {{1}} hoặc nếu bạn muốn kiểm tra logic, thì {{# 1}} bất cứ điều gì {{/ 1}}
thouliha

8
Những tính năng này có được ghi lại ở đâu đó không? Tôi không thấy {{.}}, {{1}}hoặc bất cứ thứ gì tương tự ở ria mép (5).
Daniel Lubarov,

Lưu ý: mảng cấp cao nhất không được Hogan hỗ trợ: github.com/twitter/hogan.js/issues/74 . Sử dụng giải pháp với thuộc tính: stackoverflow.com/a/8360440/470117
mems

114

Tôi đã gặp vấn đề tương tự vào sáng nay và sau một chút thử nghiệm, tôi phát hiện ra bạn có thể sử dụng {{.}} Để tham chiếu đến phần tử hiện tại của một mảng:

<ul>
  {{#yourList}}
  <li>{{.}}</li>
  {{/yourList}}
</ul>

1
Tên của biến #yourList đến từ đâu? bạn có thể hiển thị một mẫu javascript của kết xuất thực tế không?
iwein

3
bạn thậm chí không cần sử dụng "yourList", bạn chỉ có thể sử dụng "." ở đây nữa: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver

JavaScript sẽ là Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan

1
Lưu ý, chỉ làm điều này nếu bạn muốn các mẫu khó đọc hơn. Câu trả lời được chấp nhận, mặc dù không "bắt buộc" là một giải pháp dễ đọc hơn.
timoxley

7
Có ai biết tại sao nó là thông tin này không có trong tài liệu? mustache.github.io/mustache.5.html
Josh

5

Dựa trên câu trả lời của @ danjordan, điều này sẽ làm những gì bạn muốn:

Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);

trở lại:

<ul><li>foo</li><li>bar</li><li>baz</li></ul>

Nó chỉ hoạt động cho mảng chứ không phải cho các đối tượng, không thể cho {a:'foo',b:'bar',c:'baz'}... Làm thế nào để thực hiện các tham chiếu ẩn danh khi lặp qua các đối tượng?
Peter Krauss

1

Sau đây là các ví dụ để hiển thị mảng đa chiều trong một mẫu:

ví dụ 1

'use strict';

var Mustache = require('mustache');

var view = {test: 'div content', multiple : ['foo', 'bar'], multiple_2 : ['hello', 'world']};
var template = '<div>{{test}}</div><ul>{{#multiple}}<li>{{.}}</li>{{/multiple}}</ul><ul>{{#multiple_2}}<li>{{.}}</li>{{/multiple_2}}</ul>';

var output = Mustache.render(template, view);

console.log(output);

Ví dụ 2

'use strict';

var Mustache = require('mustache');

var view = {test: 'div content', multiple : [{name: 'foo', gender: 'male'}, {name: 'bar', gender: 'female'}], multiple_2 : [{text: 'Hello', append: '**', prepend: '**'}, {text: 'World', append: '**', prepend: '**'}]};
var template = '<div>{{test}}</div><ul>{{#multiple}}<li>Hello my name is {{name}}. And I am {{gender}}</li>{{/multiple}}</ul><ul>{{#multiple_2}}<li>{{prepend}}_{{text}}_{{append}}</li>{{/multiple_2}}</ul>';

var output = Mustache.render(template, view);

console.log(output);

Để chạy thử nghiệm, hãy lưu các ví dụ trên trong tệp có tên 'test.js', chạy lệnh sau trong dòng lệnh

nodejs test.js

-1

Tôi không nghĩ ria mép có thể làm được điều này! (đáng ngạc nhiên là) Bạn có thể lặp qua một danh sách các đối tượng, rồi truy cập các thuộc tính của từng đối tượng, nhưng dường như bạn không thể lặp qua một danh sách các giá trị đơn giản!

Vì vậy, bạn phải chuyển đổi danh sách của mình thành:

[ {"value":"foo"},{"value":"bar"},{"value":"baz"} ] 

và sau đó mẫu của bạn sẽ là:

<ul>
  {{#the_list}}
  <li>{{value}}</li>
  {{/the_list}}
</ul>

Đối với tôi, đây có vẻ là một vấn đề nghiêm trọng với Mustache - bất kỳ hệ thống mẫu nào cũng có thể lặp lại danh sách các giá trị đơn giản!


4
Bạn chỉ cần sử dụng {{.}}. Xem câu trả lời của tôi dưới đây.
Andy Hull

2
Các phiếu giảm giá là sai lệch. Câu trả lời này đúng vì {{.}} Không phải là một phần của tiêu chuẩn ria mép, mặc dù nó được hỗ trợ bởi một số triển khai. Không có cách di động để làm điều này.
Yefu

cái này đúng và rất hữu ích cho việc kết xuất đa chiều. Vui lòng tìm ví dụ của tôi như bên dưới
Bhupender Keswani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.