Правильная процедура для помощников тегов в усах


person Peter Ehrlich    schedule 24.11.2010    source источник


Ответы (3)


Усы очень просты по дизайну. Предполагается, что шаблоны могут отображаться на многих языках (см. https://github.com/defunkt/mustache/wiki/Other-Mustache-implementations). Многие веб-приложения выбрали усы, потому что шаблоны могут использоваться совместно клиентским кодом (javascript) и серверным кодом (независимо от языка).

Выигрыш в том, чтобы не идти против этого факта, даже если это может показаться неудобным на первый взгляд.

Исследуйте решение {{whatever_link}} и держите свой код как можно более СУХИМ.

person Gwendal Roué    schedule 24.04.2011
comment
+1 Именно это. Усы заставляют вас держать в поле зрения все, что вы можете сделать неправильно. Это значительно упрощает тестирование и, как сказал Гвендал, позволяет отображать ваши шаблоны на любом языке (например, разгрузить рендеринг на клиентский JavaScript для браузеров, которые его поддерживают). - person Michelle Tilley; 24.04.2011

Вот что я делаю в mustache.java:

import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class UrlHelper implements Map<String, String> {

    public static final UrlHelper instance = new UrlHelper();
    private static final String NORMAL_PREFIX = "url";
    private final String virtualHost;

    // configure virtualhost here
    private UrlHelper() {           
        virtualHost = "/";
    }

    public boolean containsKey(Object key) {
        return key.toString().indexOf(':') != -1;
    }

    public String get(Object key) {
        String k = key.toString();
        String prefix = k.substring(0, k.indexOf(':'));
        String url = k.substring(k.indexOf(":") + 1);
        if (prefix.equals(NORMAL_PREFIX))
            return virtualHost + url;
        return virtualHost + "static/" + prefix + "/" + url + "." + prefix;
    }
    // Default implementation for the other 'Map' methods
}

При рендеринге делаю так:

mustache.execute(writer,new Object[] { model, UrlHelper.instance }).flush();

Вы можете использовать это так (предположим, что ваше приложение размещено в /app):

{{js:lib/jquery}} {{! /app/static/js/lib/jquery.js }}
{{css:site}} {{! /app/static/css/site.css }}  
{{url:users/edit/1}} {{! /app/users/edit/1 }}

Также возможно иметь один префикс для всех статических ресурсов (например, статический), но вы не можете использовать точки для указания расширения файла, поэтому вы должны использовать какой-либо другой символ для представления точек и замены в вашем коде обработки.

Вы, вероятно, можете адаптировать эту технику к вашей веб-инфраструктуре/языку.

person Thiago de Arruda    schedule 01.06.2012
comment
это очень изящный трюк для добавления параметров в mustache.java - я искал, как передать параметры помощникам - person Tom Carchrae; 25.05.2013

Я согласен с Гвендалем в том, что цель Mustache состоит в том, чтобы иметь возможность обмениваться представлениями между вашим бэкендом и внешним интерфейсом, хотя это не единственная цель — вы можете использовать Mustache, если хотите просто очистить свои представления. В этом свете еще один способ думать об Mustache заключается в том, что он выдвигает логику на слой за непосредственным интерфейсом (то есть код Ruby). Итак, на этом среднем уровне вы можете делать все, что хотите. Я бы рекомендовал использовать гем stache, потому что он заполняет пробел между Mustache-land и Rails-land, делая связь между вашим классом представления Mustache и базовым классом представления Rails. Таким образом, вы можете использовать, например, link_to в этом среднем слое. Вам нужно было бы создать метод представления, который обертывал бы вызов link_to для конкретного объекта, поскольку вы не можете вызывать методы в шаблоне Mustache и передавать ему аргументы, но я думаю, что это нормально.

person Elliot Winkler    schedule 16.09.2012