2014-02-04 4 views
5

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

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

Используя обычные разделы как
{{#stringOrArray}} <li>{{.}}</li> {{/stringOrArray}} не печатает значение, если его просто String.

+1

Я всегда иду по одноэлементному массиву ... –

ответ

10

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

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

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

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

var data = { 
    test: "test1" 
} 

ИЛИ

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

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

1

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

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

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

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

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

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

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

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

abov Настройка электронной напечатает следующее, потому что 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/

+0

Мне не понравился ваш тест isArray, поэтому он искал его и нашел как http://stackoverflow.com/questions/4775722/check-if-object- is-array и http://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript ... и они не согласны. Должен любить это. – lmsurprenant

+0

@lmsurprenant - Я просто делаю довольно грязную проверку, чтобы увидеть, является ли это массивом, вы можете заменить его на любой более элегантный тест, который вы желаете ... Техника установки свойства isArray, чтобы шаблон усы мог работать в вашем сценарий является важной частью. –

Смежные вопросы