Mustache, üst düzey bir diziyi yineleyebilir mi?


109

Nesnem şuna benziyor:

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

Ve bunun gibi bir şey üretmek için bir bıyık şablonu kullanmak istiyorum:

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

Ama nasıl? Bunu önce gerçekten böyle bir şeye dönüştürmem gerekiyor mu?

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

Yanıtlar:


169

Böyle yapabilirsin ...

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

Bunun gibi şeyler için de işe yarar ...

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

2
aslında şablon önce gelir: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver

Örneğin dizinin 2. elemanını nasıl elde ederim? Mustache.js ile {{.1}} yapmaya çalışıyorum ve çalışmıyor.
thouliha

NM, anladı: noktaları görmezden gelebilirsiniz: yani {{1}} veya mantıklı bir kontrol yapmak istiyorsanız, {{# 1}} her neyse {{/ 1}}
thouliha

8
Bu özellikler bir yerde belgelenmiş mi? Ben görmüyorum {{.}}, {{1}}ya bıyıklı (5) benzer şey.
Daniel Lubarov

Not: üst seviye dizi Hogan tarafından desteklenmemektedir: github.com/twitter/hogan.js/issues/74 . Çözümü bir özellik ile kullanın: stackoverflow.com/a/8360440/470117
mems

115

Bu sabah da aynı sorunu yaşadım ve küçük bir deneyden sonra, bir dizinin geçerli öğesine başvurmak için {{.}} Kullanabileceğinizi keşfettim:

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

1
#YourList değişkeninin adı nereden geliyor? gerçek işlemenin bir javascript örneğini gösterebilir misiniz?
iwein

3
"Listeniz" i kullanmanıza bile gerek yok, sadece "" kullanabilirsiniz. burada da: Mustache.render('<ul>{{#.}}<li>{{.}}</li>{{/.}}</ul>',['foo','bar','baz']);
Kai Carver

JavaScript şöyle olacaktır Mustache.render('<ul>{{#.}}{{.}}{{/.}}</ul>', {yourList: ['foo','bar','baz']});
Dan Jordan

1
Bunu yalnızca daha az okunabilen şablonlar istiyorsanız yapın. Kabul edilen yanıt, "gerekli" olmasa da daha okunaklı bir çözümdür.
timoxley

7
Bu bilgilerin neden belgelerde bulunmadığını bilen var mı? mustache.github.io/mustache.5.html
Josh

5

@ Danjordan'ın cevabına dayanarak, bu istediğinizi yapacak:

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

dönen:

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

Sadece {a:'foo',b:'bar',c:'baz'}nesneler için değil diziler için çalışır, bunun için imkansızdır ... Nesneler üzerinde yineleme yaparken anonim referanslar nasıl yapılır?
Peter Krauss

1

Aşağıda, bir şablonda çok boyutlu dizi oluşturmak için örnekler verilmiştir:

örnek 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);

Örnek 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);

Test çalışması için, yukarıdaki örnekleri 'test.js' adlı dosyaya kaydedin, komut satırında aşağıdaki komutu çalıştırın

nodejs test.js

-1

Bıyığın bunu yapabileceğini sanmıyorum! (şaşırtıcı bir şekilde) Bir nesne listesi üzerinde yineleme yapabilir ve ardından her nesnenin özniteliklerine erişebilirsiniz, ancak basit bir değerler listesi üzerinde yineleme yapamazsınız!

Yani, listenizi şuna dönüştürmelisiniz:

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

ve sonra şablonunuz şöyle olur:

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

Bana göre, bu Mustache ile ilgili ciddi bir sorun gibi görünüyor - herhangi bir şablon sistemi basit değerler listesi üzerinde döngü yapabilmelidir!


4
Sadece {{.}} Kullanmanız gerekiyor. Aşağıdaki cevabıma bakın.
Andy Hull

2
Eksik oylar yanıltıcıdır. Bu yanıt, bazı uygulamalar tarafından desteklense de {{.}} Bıyık standardının bir parçası olmadığı için doğrudur. Bunu yapmanın taşınabilir bir yolu yok.
Yefu

bu doğru ve çok boyutlu sunum için çok kullanışlıdır. Lütfen örneğimi aşağıdaki gibi bulun
Bhupender Keswani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.