Как выполнить if/else в файле mustache.js?

Кажется довольно странным, что я не могу понять, как это сделать в усах. Поддерживается ли это?

Это моя грустная попытка попробовать:

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

Это, очевидно, неправильно, но в документации не упоминается ничего подобного. Слово "else" даже не упоминается: (

Кроме того, почему усы разработаны таким образом? Это что-то считается плохой? Он пытается заставить меня установить значение по умолчанию в самой модели? Как насчет случаев, когда это невозможно?

Ответ 1

Так вы делаете if/else в Mustache (отлично поддерживается):

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

Или в вашем случае:

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

Ищите перевернутые разделы в документах: https://github.com/janl/mustache.js

Ответ 2

Это то, что вы решаете в "контроллере", который является точкой без логического шаблона.

// 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

}

Это на самом деле намного лучше, чем поддерживать URL-адрес изображения или другие носители, которые могут или не могут быть изменены в ваших шаблонах, но к чему-то привыкают. Суть заключается в том, чтобы отменить шаблонное видение туннеля, URL-адрес аватара img обязательно будет использоваться в других шаблонах, собираетесь ли вы поддерживать этот URL-адрес на шаблонах X или один объект настроек DEFAULTS?;)

Другой вариант - сделать следующее:

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

И в шаблоне:

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

Но это противоречит всему смыслу логического шаблона. Если это то, что вы хотите сделать, вам нужны логические шаблоны, и вы не должны использовать Усы, хотя сами даете ему возможность получить эту концепцию;)

Ответ 3

Ваше другое выражение должно выглядеть так (обратите внимание на ^):

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

В усах это называется "Перевернутые разделы".