Как обрабатывать строку или массив строк в шаблоне усов

У меня есть простой/начинающий вопрос для использования шаблонов усов в моем приложении (или Хоган точнее). Я использую API, который иногда возвращает строку, а иногда возвращает массив строк.

Я знаю, что может обернуть строку в одноэлементный массив, но есть ли способ обработать эту опциональность из шаблона усов?

использование нормальных разделов, таких как
{{#stringOrArray}} <li>{{.}}</li> {{/stringOrArray}} не печатает значение, если это просто строка.

2 ответов


Я знаю, что немного поздно, но вот что я использую:

{{#test.length}}
    {{#test}}<li>{{.}}</li>{{/test}}
{{/test.length}}

{{^test.length}}
    <li>{{test}}</li>
{{/test.length}}

это как обнаружение функций. Первый блок кода проверяет, имеет ли тест длину, если да, то это массив (да, я знаю, что строки также должны иметь свойство length, но они этого не делают). Он либо выведет массив (если это массив), либо ничего (если это не так). Второй блок выводит значение из испытаний, если оно не имеет длины (т. е. это строка или целое число и т. д.) Это означает, что вы можете использовать его on:

var data = {
    test: "test1"
}

или

var data = {
    test: [ "test1", "test2", "test3" ]
}

без необходимости устанавливать флаг для того, является ли это массивом или нет. Усы тебе помогут.


Я не знаю, как это сделать непосредственно из вашего объекта без каких-либо вспомогательных переменных. Вот что вы можете сделать до передачи данных в шаблон, чтобы избежать необходимости возиться с кодом, который генерирует исходный объект JSON.

пусть это будет ваш объект JSON:

var data = {
    test: [ "test1", "test2", "test3" ]
}

пусть это будет ваш шаблон усы:

{{#isArray}}
    {{#test}} <li>{{.}}</li>{{/test}}
{{/isArray}}

{{^isArray}}
    {{test}}
{{/isArray}}

пусть это будет ваш код, который компилирует / вызывает ваш шаблон усов (я использую документ.тело.свойство innerHTML потому что именно так я настроил пример JSFIDDLE):

var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);

вышеуказанная настройка распечатает следующее, потому что isArray не определено, поэтому он выполнит блок, который отрицает isArray С ^ символ (например, он будет рассматривать данные как строку, даже если это массив):

test1,test2,test3

Я предлагаю, если вы не хотите прикасаться к коду, который генерирует JSON, что вы вводите некоторый javascript перед вызовом Mustache.render установить isArray собственность. Вот как я бы проверил существование pop способ для того, чтобы установить isArray правильно перед передачей данных в шаблон:

if (data.test.pop) { data.isArray = 1; } else { data.isArray = 0; }
var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);

это позволит правильно распечатать нужные элементы li:

test1
test2
test3

я привел здесь рабочий пример, который использует экземпляры массива и строки в элементе данных, чтобы показать, что решение работает:

http://jsfiddle.net/s7Wne/1/