web-dev-qa-db-fra.com

Comment puis-je accomplir un if / else dans moustache.js?

Il semble plutôt étrange que je ne sache pas comment faire cela avec une moustache. Est-ce pris en charge?

C'est ma triste tentative d'essayer:

    {{#author}}
      {{#avatar}}
        <img src="{{avatar}}"/>
      {{/avatar}}
      {{#!avatar}}
        <img src="/images/default_avatar.png" height="75" width="75" />
      {{/avatar}}
    {{/author}}

Ce n’est évidemment pas correct, mais la documentation ne mentionne rien de ce genre. Le mot "else" n'est même pas mentionné :(

Aussi, pourquoi la moustache est-elle conçue de cette façon? Est-ce que ce genre de chose est considéré comme mauvais? Est-ce qu'il essaie de me forcer à définir la valeur par défaut dans le modèle lui-même? Qu'en est-il des cas où ce n'est pas possible?

242
egervari

Voici comment procéder si/else dans Moustache (parfaitement pris en charge):

{{#repo}}
  <b>{{name}}</b>
{{/repo}}
{{^repo}}
  No repos :(
{{/repo}}

Ou dans votre cas:

{{#author}}
  {{#avatar}}
    <img src="{{avatar}}"/>
  {{/avatar}}
  {{^avatar}}
    <img src="/images/default_avatar.png" height="75" width="75" />
  {{/avatar}}
{{/author}}

Recherchez les sections inversées dans la documentation: https://github.com/janl/mustache.js

467
Eneko Alonso

C'est quelque chose que vous résolvez dans le "contrôleur", qui est le point de la création de modèles sans logique.

// some function that retreived data through ajax
function( view ){

   if ( !view.avatar ) {
      // DEFAULTS can be a global settings object you define elsewhere
      // so that you don't have to maintain these values all over the place
      // in your code.
      view.avatar = DEFAULTS.AVATAR;
   }

   // do template stuff here

}

C’est en fait BEAUCOUP meilleur que de conserver l’URL de l’image ou un autre média qui pourrait changer ou non dans vos modèles, mais qui demande un certain temps de s’y habituer. Le but est de désapprendre la vision tunnel des modèles, un avatar img url doit nécessairement être utilisé dans d'autres modèles. Voulez-vous conserver cette URL sur les modèles X ou un seul objet de paramètres DEFAULTS? ;)

Une autre option consiste à effectuer les opérations suivantes:

// augment view
view.hasAvatar = !!view.avatar;
view.noAvatar = !view.avatar;

Et dans le modèle:

{{#hasAvatar}}
    SHOW AVATAR
{{/hasAvatar}}
{{#noAvatar}}
    SHOW DEFAULT
{{/noAvatar}}

Mais cela va à l’encontre de tout ce que l’on entend par des modèles sans logique. Si c'est ce que vous voulez faire, vous voulez un modèle logique et vous ne devriez pas utiliser Moustache, mais donnez-vous une chance raisonnable d'apprendre ce concept;)

52
BGerrissen

Votre déclaration else devrait ressembler à ceci (notez le ^):

{{^avatar}}
 ...
{{/avatar}}

Dans la moustache, cela s'appelle les "sections inversées".

14
anonym