Bigode JS e singular / plural

9

Eu uso o bigode para modelar minhas chamadas de javascript ajax, aqui estão meus dados e o modelo:

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

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

Funciona, no entanto, quero corrigir a gramática, se mais de uma pessoa entrar, quero mostrar 5 people joined so far .

Como conseguir isso sem manipular o servidor ajax json respondedor?

    
por Hellnar 15.11.2011 в 15:14
fonte

2 respostas

5

Você pode adicionar lógica condicional dentro do objeto JavaScript, se puder persuadir o AJAX do lado do servidor a entregá-lo dessa maneira:

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

link

    
por Blazemonger 15.11.2011 / 15:34
fonte
1

Na verdade, você pode fazer isso apenas com o Mustache, mas, para o caso, o JSON contém não apenas um número, mas uma matriz de valores, junto com o tamanho da matriz:

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

Para fazer isso, você pode usar um dos seguintes modelos de bigode:

No caso simples, quando você só precisa adicionar "s" para plural:

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

O resultado:

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

No caso geral, quando o plural é especial (como pessoas / pessoa):

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

O resultado:

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

Você pode encontrar os dois modelos aplicados na prática aqui: link

P.S. Eu vou postar novamente aqui se eu puder encontrar a solução para esta:

No people joined so far.
1 person joined so far.
2 people joined so far.
    
por Sorin Postelnicu 16.11.2017 / 19:38
fonte