Усы JS и единственное / множественное число - PullRequest
9 голосов
/ 15 ноября 2011

Я использую усы для шаблонизации моих javascript-вызовов ajax. Вот мои данные и шаблон:

{'joined':1} // ajax responde data json.

var myTemplate = '{{ joined }} person joined so far.'

Это работает, однако я хочу исправить это, если присоединяется более 1 человекаЯ хочу показать 5 people joined so far.

Как этого добиться, не манипулируя серверной стороной ajax json response?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2011

Вы можете добавить условную логику в объект JavaScript, если вы можете уговорить серверный AJAX доставить его таким образом:

var json = {
    'joined': 1,
    'ppl': function() {
        return (this.joined === 1) ? 'person' : 'people'
    }
} // ajax responde data json.
var myTemplate = '{{ joined }} {{ppl}} joined so far.'

Mustache.to_html(myTemplate, json);

http://jsfiddle.net/mblase75/H8tqn/

1 голос
/ 16 ноября 2017

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

var json = {
  'rows': ['a','b','c'],
  'numRows': function() {
      return this.rows.length
   }
} // ajax response data json.

Для этого вы можете использовать один из следующих шаблонов усов:

В простом случае, когда вам просто нужно добавить «s» для множественного числа:

var myTemplate = '{{ numRows }} link{{^rows}}s{{/rows}}{{#rows.1}}s{{/rows.1}} parsed so far.'

Результат:

0 links parsed so far.
1 link parsed so far.
2 links parsed so far.

В общем случае, когда множественное число является особенным (как человек / человек):

var myTemplate2 = '{{ numRows }} {{^rows}}people{{/rows}}{{#rows.0}}{{^rows.1}}person{{/rows.1}}{{/rows.0}}{{#rows.1}}people{{/rows.1}} joined so far.'

Результат:

0 people joined so far.
1 person joined so far.
2 people joined so far.

Здесь вы можете найти оба применяемых на практике шаблона: http://jsfiddle.net/H8tqn/9/


P.S. Я снова напишу здесь, если смогу найти решение для этого:

No people joined so far.
1 person joined so far.
2 people joined so far.
...