Atualmente, estou lidando com handlebars.js em um aplicativo express.js. Para manter as coisas modulares, divido todos os meus modelos em parciais.
Meu problema : não consegui encontrar uma maneira de passar variáveis através de uma invocação parcial. Digamos que eu tenho um parcial que se parece com isso:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Vamos supor que registrei esta parcial com o nome 'myPartial'. Em outro modelo, posso dizer algo como:
<section>
{{> myPartial}}
</section>
Isso funciona bem, a parcial será renderizada conforme o esperado e eu sou um desenvolvedor feliz. Mas o que eu preciso agora é de uma maneira de passar variáveis diferentes por essa invocação, para verificar de forma parcial, por exemplo, se um título é fornecido ou não. Algo como:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
E a invocação deve ser algo como isto:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
ou então.
Eu sei que sou capaz de definir todos os dados necessários antes de renderizar um modelo. Mas eu preciso de uma maneira de fazer isso, como acabei de explicar. Existe uma maneira possível?
fonte
this
, você poderia passar no seu próprio contexto. Por exemplo, defina dados extras a serem passados, como{new_variable: some_data}
?{{> partialName {new_variable: some_data} }}
key=value
. Existe algum problema abordando isso no github?Apenas no caso, aqui está o que eu fiz para obter argumentos parciais, mais ou menos. Eu criei um pequeno ajudante que leva um nome parcial e um hash de parâmetros que serão passados para o parcial:
O principal aqui é que os auxiliares do guidão aceitam um hash de argumentos do tipo Ruby . No código auxiliar, eles vêm como parte do último argumento da função
options
- - em seuhash
membro. Dessa forma, você pode receber o primeiro argumento - o nome parcial - e obter os dados depois disso.Então, você provavelmente deseja devolver um
Handlebars.SafeString
do ajudante ou usar o "esconderijo triplo" -{{{
- para impedir que ele escape duas vezes.Aqui está um cenário de uso mais ou menos completo:
Espero que isso ajude ... alguém. :)
fonte
Isso é muito possível se você escrever seu próprio ajudante. Estamos usando um
$
auxiliar personalizado para realizar esse tipo de interação (e mais):fonte
hbs.registerPartials(path.join(__dirname, '/views/partials'), function() { utils.precompileHandlebarsPartials(hbs); }); // Pre compile the partials precompileHandlebarsPartials : function(hbs) { var partials = hbs.handlebars.partials; for (var partial in partials) { if (typeof partials[partial] === 'string') { partials[partial] = hbs.handlebars.compile(partials[partial]); } }; }
Isso também pode ser feito em versões posteriores do guidão usando a
key=value
notação:Permitindo que você passe valores específicos para o seu contexto parcial.
Referência: Contexto diferente para o parcial # 182
fonte
A resposta aceita funciona muito bem se você deseja apenas usar um contexto diferente na sua parcial. No entanto, não permite que você faça referência a nenhum contexto pai. Para passar vários argumentos, você precisa escrever seu próprio auxiliar. Aqui está um auxiliar de trabalho para o guidão
2.0.0
(a outra resposta funciona para versões<2.0.0
):Em seguida, no seu modelo, você pode fazer algo como:
E no seu parcial, você poderá acessar esses valores como contexto, como:
fonte
Parece que você quer fazer algo assim:
Yehuda já lhe deu uma maneira de fazer isso:
Mas para esclarecer:
Para fornecer dados parciais a seus próprios dados, basta fornecer seu próprio modelo dentro do modelo existente, da seguinte forma:
Em outras palavras, se este é o modelo que você está dando ao seu modelo:
Em seguida, adicione um novo objeto a ser dado à parcial:
childContext
torna-se o contexto do parcial como Yehuda disse - nisso, ele apenas vê o campoanother
, mas não vê (ou se preocupa com o camposome
). Se você tivesseid
no modelo de nível superior e repitaid
novamente no childContext, isso funcionará muito bem, pois a parcial só vê o que está dentrochildContext
.fonte
Sim, cheguei atrasado, mas posso adicionar aos usuários do Assemble : você pode usar o
"parseJSON"
auxiliar de montagem http://assemble.io/helpers/helpers-data.html . (Descoberto em https://github.com/assemble/assemble/issues/416 ).fonte
Não tenho certeza se isso é útil, mas aqui está um exemplo de modelo de guidão com parâmetros dinâmicos passados para um RadioButtons parcial em linha e o cliente (navegador) processando os botões de opção no contêiner.
Para meu uso, ele é renderizado com guidão no servidor e permite que o cliente finalize. Com ele, uma ferramenta de formulários pode fornecer dados embutidos no Guiador sem auxiliares.
Nota: Este exemplo requer jQuery
fonte