Como usar as instruções if nos modelos underscore.js?


239

Estou usando a função de modelo underscore.js e fiz um modelo como este:

<script type="text/template" id="gridItem">
    <div class="griditem <%= gridType %> <%= gridSize %>">
        <img src="<%= image %>" />
        <div class="content">
            <span class="subheading"><%= categoryName %></span>
            <% if (date) { %><span class="date"><%= date %></span><% }  %>
            <h2><%= title %></h2>
        </div>
    </div>
</script>

Como você pode ver, eu tenho uma instrução if, porque todos os meus modelos não terão o parâmetro date. No entanto, essa maneira de fazer isso me dá um erro date is not defined. Então, como posso fazer as declarações if dentro de um modelo?

Respostas:


442

Isso deve fazer o truque:

<% if (typeof(date) !== "undefined") { %>
    <span class="date"><%= date %></span>
<% } %>

Lembre-se de que nos modelos underscore.js ife forsão apenas a sintaxe javascript padrão envolvida em <% %>tags.


2
Funciona muito bem e acabamos de descobrir que as instruções de switch / case JS também funcionam bem na marcação de modelo.
— nickb

Resposta incrível. Você também pode dizer como posso usar classes alternadas quando estou usando modelos? Como o primeiro <li> deve obter a classe ae o próximo b?
— BlackDivine

4
@BlackDivine Eu sei que é meio tarde, mas para estilos alternativos você deve usar seletores CSS :nth-child(even)e :nth-child(odd)não alterar seu modelo.
— prayerslayer

seu olhar mesmo que scriptlets Java usada para renderizar variáveis em jsp
— Dungeon Hunter

Acabei com essa linha no final {{}}}, porque tive que alterar o wrapper <%%> e ainda funcionava.
— 0v3rth3d4wn

78

Se você preferir uma declaração mais curta, se houver, poderá usar esta abreviação:

<%= typeof(id)!== 'undefined' ?  id : '' %>

Significa exibir o ID se for válido e em branco se não for.


6
operador ternário
— user457015

4
Operador condicional , que recebe o apelido "ternário", pois é o único operador ternário comum (três operandos).
— Keen

1
Observe que uma falha ocasional da técnica proposta nesta resposta é que você está preso repetindo a interpolação de strings, quais modelos devem resolver para você. A partir de agora, _.templateinsere um ;no início de cada tag de código compilado. Assim, ele pode manipular tags quebrando entre instruções, mas não dentro de expressões. Compare ;if(a){b;}else{c;}com ;a?b;:c;.
— Keen

21

Dependendo da situação e / ou do seu estilo, você também pode usar a impressão dentro de suas <% %>tags, pois isso permite a saída direta. Gostar:

<% if (typeof(id) != "undefined") {
     print(id);
}
else {
    print('new Model');
} %>

E para o trecho original com alguma concatenação:

<% if (typeof(date) != "undefined") {
    print('<span class="date">' + date + '</span>');
} %>

9

Aqui está uma verificação if / else simples no underscore.js, se você precisar incluir uma verificação nula.

<div class="editor-label">
    <label>First Name : </label>
</div>
<div class="editor-field">
    <% if(FirstName == null) { %>
        <input type="text" id="txtFirstName" value="" />
    <% } else { %>
        <input type="text" id="txtFirstName" value="<%=FirstName%>" />
    <% } %>
</div>

1
nulo não é o mesmo que indefinida, ele ainda iria produzir um erro
— xorinzor

4
Nesse caso, não importaria, pois ele verifica o valor usando ==, que converterá o valor. Por causa da conversão de tipo, a seguinte instrução é verdadeira: null == undefined - Não é para endossar isso, apenas para dizer.
— Johannes Lumpe

Eu acho que é melhor usar_.isEmpty()
— Nick Barrett

5

Respondendo ao blackdivine acima (sobre como distribuir os resultados), você já deve ter encontrado sua resposta (se for o caso, que vergonha por não compartilhar!), Mas a maneira mais fácil de fazer isso é usando o operador de módulo. digamos, por exemplo, você está trabalhando em um loop for:

<% for(i=0, l=myLongArray.length; i<l; ++i) { %>
...
<% } %>

Dentro desse loop, basta verificar o valor do seu índice (i, no meu caso):

<% if(i%2) { %>class="odd"<% } else { %>class="even" <% }%>

Isso verificará o restante do meu índice dividido por dois (alternando entre 1 e 0 para cada linha do índice).


3

Você pode tentar _.isUndefined

<% if (!_.isUndefined(date)) { %><span class="date"><%= date %></span><% } %>

Cuidado com a diferença entre "a data é indefinida" e "a data não está definida". Eles deveriam ter chamado esse erro "Nenhuma variável ou propriedade global existe com o nome 'date'". O código que você propôs ainda lançará uma exceção, se datenão existir. Você realmente precisa typeofdesse caso, embora seja ainda melhor usar uma variável nomeada quando estivermos digitando dados do modelo.
— Keen

0

A partir daqui :

"Você também pode se referir às propriedades do objeto de dados através desse objeto, em vez de acessá-las como variáveis." Isso significa que, no caso do OP, isso funcionará (com uma alteração significativamente menor do que outras possíveis soluções):

<% if (obj.date) { %><span class="date"><%= date %></span><% }  %>

0

Para verificar valores nulos, você pode usar _.isNullda documentação oficial

isNull_.isNull(object)

Retorna true se o valor do objeto for nulo.

_.isNull(null);
=> true
_.isNull(undefined);
=> false
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.