Handlebars.js: Registre variáveis ​​globais.

Criado em 22 fev. 2016  ·  7Comentários  ·  Fonte: handlebars-lang/handlebars.js

Às vezes é útil ter variáveis ​​globais para templates.
Alguns exemplos podem incluir coisas como:

  • O objeto de usuário ativo.
  • Configuração do aplicativo (título, descrição, meta)
  • Informações de rota (caminho, hash, etc).

Eu estava pensando que seria legal adicionar algo como:

var hbs = require("handlebars");

hbs.registerGlobal({
   title: "myapp"
});

Que pode ser referenciado em qualquer modelo, talvez via @global.title , @title ou apenas title .

Pensamentos?

docs-needed

Comentários muito úteis

@kpdecker template(context, {data: {global: global}}) não está explicitamente documentado.
O mais próximo que eu vi é template({}, {data: {level: Handlebars.logger.WARN}})

Mas a documentação não menciona que um segundo parâmetro pode ser passado.

Todos 7 comentários

Eu estava pensando mais sobre isso e acho que criar um ajudante em linha poderia fazer o que você deseja.

var hbs = require("handlebars");
var myGlobal = {
   title: "myapp"
};

hbs.registerHelper('global', function(key){
  return myGlobal[key];
});
{{! in your template }}
<div>{{global "title"}}</div>

E você pode fazer o que quiser com myGlobal
Você pode

define('myGlobal', function(){
  return {
    title: "myapp"
  };
});

...
var myGlobal = require('myGlobal');

myGlobal['newKey'] = 'something';

...

var hbs = require("handlebars");
var myGlobal = require('myGlobal');

hbs.registerHelper('global', function(key){
  return myGlobal[key];
});

Naturalmente, há uma desvantagem, como as teclas sendo substituídas, mas isso é tudo.

Apoiar isso no próprio Handlebars exigirá muita sobrecarga para pouco ganho, IMO.

Existem várias opções como a sugestão de ajuda do @rafde ou passando o global no campo de dados, que deve realmente funcionar com a sintaxe proposta acima:

template(context, {data: {global: global}})

Deve expor tudo na janela em {{@global.foo}} , mas eu não testei isso e você precisará validar se isso de fato funciona.

@kpdecker template(context, {data: {global: global}}) não está explicitamente documentado.
O mais próximo que eu vi é template({}, {data: {level: Handlebars.logger.WARN}})

Mas a documentação não menciona que um segundo parâmetro pode ser passado.

Nossa documentação geralmente está faltando, mas se você quiser ajudar a melhorar, isso seria incrível.

Isso é amplamente testado: https://github.com/wycats/handlebars.js/blob/master/spec/data.js#L1

Por que você não poderia fazer isso simplesmente definindo o par chave/valor em um objeto não variável?

glabalPair = {title: "Title"};

https://github.com/wycats/handlebars.js/blob/master/spec/data.js#L1 foi a resposta. Fechando isso, mas a documentação ainda deve ser adicionada.

Ainda não documentado?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

morgondag picture morgondag  ·  5Comentários

rizen picture rizen  ·  6Comentários

rhariraman picture rhariraman  ·  5Comentários

ricardograca picture ricardograca  ·  4Comentários

stevenvachon picture stevenvachon  ·  7Comentários