Мылтығы үлгілері үлгі кеңейтімін жасай алады ма?

Мен Мущейге жаңадан келдім.

Көптеген шаблондар тілдері (мысалы, Django / Jinja ) сіз сияқты «ата-ана» үлгісін кеңейтеді ...

base.html

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>

frontpage.html

{% extends "base.html" %}
{% block content %}

Foobar!

{% endblock %}

frontpage.html көрсетілді

<html><head></head>
    <body>
    

Foobar!

    </body>
</html>

I'm aware of Mustache's partials (e.g., {{>content}}), but those seem to be just includes.

Мұрт үшін үлгі кеңейтімі бар ма? Немесе, егер ол болмаса, онда кем дегенде кейбір қамтиды үлгісін кеңейту эквиваленттеріне айналдыратын кейбір дизайн үлгісі бар.

51

8 жауаптар

Мен жақында бір кемеде таптым, тек макодан шыққаннан басқа.

Мылтығы үлгіні кеңейтуге/мұраға беруге рұқсат бермейді, бірақ сіз білетін бірнеше нұсқалар бар.

  1. You could use partials:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. You could inject template pre-processing functions into the context for each template that needs to inherit from some other page:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    

    Hash:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. Prepend and append the desired HTML to the relevant pages in your controller.

  4. Have a layout template ala:

    {{>header}}
        {{{body}}}
    {{>footer}}
    

    And render the body in your controller, passing that to the layout template as a variable named body.

  5. Implement template inheritance, pre-mustache, in your code that loads templates.

I wouldn't, however, use the triple mustache because I don't want unescaped HTML to be appearing anywhere, it's just too risky in my opinion.

If someone else has a better solution to this problem I'd love to hear it as well, since I haven't yet taken the plunge in any one of these directions.

59
қосылды
PHP ішіне қолдануға болатын жолдың ішінара ұқсастығы бар ма?
қосылды автор Alvaro, көзі
# 4 - «үш мылтық» болуы керек - {{body}}}
қосылды автор Chris W., көзі
Ия, өкінішке орай, сіз дұрыс деп ойлайсыз, мен үшін # 4 ереже бұзылған. Мен жауапты жаңарттым.
қосылды автор Walden, көзі
Сайып келгенде, қайтадан қолданылатын суб-үлгілерді жасау және үлгіні жүктеу кодын (мысалы, # 5) иелену мүлде әлдеқайда икемді және қауіпсіз болып табылады. Үлгіні мұраға беру мәселесі сыртқы үлгісін жазғанда, сіз ешқашан бала үлгісінде талап етілетін (немесе талап етілмейтін) мағынаны біле алмайсыз. Бұл көбінесе сыртқы үлгідегі белгілі бір балалар бетіне (бірақ басқа үшін қажет емес) қажет болуы мүмкін JS/CSS-ны қосуға әкеледі. Үлгі мұра пайдалану кезінде бұл мәселені шешудің жалғыз жолы JS/CSS талаптарын айнымалы ретінде беру болып табылады.
қосылды автор Walden, көзі
Мұқабаның твиттердің нұсқасы үлгінің мұрагері .
қосылды автор Walden, көзі
(@Walden Сіздің тізіміңізге 0 немесе 6 нөмірін қосып, Hoogian-ды қосып қоюыңыз керек пе дегенмен :-))
қосылды автор KajMagnus, көзі

Мен бұны Мутант үшін мына ерекшелікте ұсындым:

https://github.com/mustache/spec/issues/38

Қазіргі уақытта mustache.java, hogan.js және phly_mustache үлгіні қолдайды.

12
қосылды
Дегенмен, Hogan.js туралы, сіз оны құжаттамадан білмейтін боласыз: github.com /twitter/hogan.js/issues/70
қосылды автор Paul D. Waite, көзі
GRMustache сияқты.
қосылды автор Gwendal Roué, көзі

Мылтығы үлгі кеңейтімін жасамайды.

Сіз шынымен кеңейтілген кеңейтімді қаласаңыз, сізге осы функциямен салынған кітапхана мақсатын таңдауыңызға болады.


FYI, I'm using Node.js/Express, so I will probably end up using https://github.com/fat/stache

3
қосылды
W Stash сақталмайды, ал hogan.js, ұсыныс ауыстыру кеңейтілмеген сияқты.
қосылды автор mikemaccana, көзі
Твиттердің ходжяны мұраға қолдау көрсететін сияқты. Бұл соңғы міндеттемені қараңыз: Hogan 3. Үлгіні мұраға қосу, ...
қосылды автор KajMagnus, көзі

Мучче php-де, үлгі мұрағатына 2.7.0 нұсқасынан бастап қолдау көрсетіледі.

https://github.com/bobthecow/mustache.php/wiki/BLOCKS-pragma

Сіз өзіңіздің ағымдағы нұсқаңызды Mustache/Engine.php файлынан анықтай аласыз және келесі жолды іздей аласыз:

class Mustache_Engine
{
    const VERSION        = '2.8.0';
    ...
3
қосылды

HTML бар айнымалы мәндерді қолдануға болады. {{variable}}} тәрізді «үш мылтық» сақталмаған HTML қайтарады. Бұл үлгі кеңейтімдері сияқты бірдей емес, бірақ сіз frontpage-content.html көрсете аласыз, одан кейін базаға жіберілетін content айнымалы мәніне шығаруға болады. html .

(Мұндай атау үлгісі файл атауларын басқаруға көмектесетінін күткенде -content ) frontpage.html файл атауына қосылды.)

3
қосылды

Мен дәл қазір Python-да ойнап жүрмін (менің Mako-ның жасаушысы екенімді еске түсірейін), бөлімдерді қамтитын динамикалық контексті қосу дұрыс нәрсе болып жатса да, мұны әлдеқайда сынап көруім керек.

Basically we are using lambdas, where a "<" prefix indicates "inherit from this template" (similar to the syntax discussed at https://github.com/mustache/spec/issues/38) and a "$" prefix indicates "this is an inherited section".

import pystache

class NameSpace(object):
    def __init__(self, renderer, vars_={}):
        self.renderer = renderer
        self._content = {}
        self.vars = vars_

    def add_content(self, name, value):
        self._content[name] = value

    def __getattr__(self, key):
        if key in self.vars:
            # regular symbol in the vars dictionary
            return self.vars[key]
        elif key.startswith("<"):
            # an "inherit from this template" directive
            name = key[1:]
            return inheritor(self, name)
        elif key.startswith("$"):
            # a "here's a replaceable section" directive
            name = key[1:]
            if name in self._content:
                # if we have this section collected, return the rendered
                # version
                return sub_renderer(self, name)
            else:
                # else render it here and collect it
                return collector(self, name)
        else:
            # unknown key.
            raise AttributeError(key)

def sub_renderer(namespace, key):
    def go():
        def render(nested):
            return namespace._content[key]
        return render
    return go


def collector(namespace, key):
    def go():
        def render(nested):
            content = namespace.renderer.render(nested, namespace)
            namespace.add_content(key, content)
            return content
        return render
    return go


def inheritor(namespace, name):
    def go():
        def render(nested):
            namespace.renderer.render(nested, namespace)
            return namespace.renderer.render_name(name, namespace)
        return render
    return go

Міне, кейбір үлгілер. base.mustache:

<html>

{{#$header}}
    default header
{{/$header}}

{{#$body}}
    default body
{{/$body}}

{{#$footer}}
    default footer, using {{local key}}
{{/$footer}}


</html>

hello.mustache:

{{#

содан кейін терең үш деңгейде ойнауға, subhello.mustache:

{{#

Hello.mustache мына сияқты:

renderer = pystache.Renderer(search_dirs=["./templates/"])

print renderer.render_name("hello",
                    NameSpace(renderer, {"local key": "some local key"}))

шығу:

<html>

    new header

    new body, with some local key

    default footer, using some local key


</html>

Subhello.mustache көрсету:

print renderer.render_name("subhello",
                    NameSpace(renderer, {"local key": "some local key"}))

шығу:

<html>

    new header

    new body, with some local key

    im some new footer


</html>

Мен оны жиырма минутта жазған болатынмын, мен бұған дейін handlebars.js-ді ғана қолданғанмын, алайда қазірдің өзінде алғашқы рет писташамен айналыстым. Бірақ бұл қалай жұмыс істейді?

1
қосылды

Егер сіз тек серверлік жағынан ғана бақытты болсаңыз, Nun - бұл Бьюстанға ұқсас шаблондау жүйесі, шаблонды жою функциясы - django арналған модель. Дегенмен, ол жұмыс істейді, бірақ оның авторы қолдау емес.

0
қосылды

Node.js ішіне сіз экспресс-роликтер немесе hogan-express layout инна үлбірінің үлгілері болуы үшін, бірақ олардың істері қалай ерекшеленеді, олардың ешқайсысында үлгіні өзі үлгісіне қойдыңыз , орналасулар сіздің бағдарламаңыздың кодында тіркеледі.

0
қосылды