Existe uma maneira no JS de guidão incorporar operadores lógicos no operador condicional padrão handlebars.js? Algo assim:
{{#if section1 || section2}}
.. content
{{/if}}
Sei que poderia escrever meu próprio ajudante, mas primeiro gostaria de ter certeza de que não estou reinventando a roda.
javascript
handlebars.js
Mike Robinson
fonte
fonte
registerBoundHelper
não pode lidar com a sintaxe do Handlebars. A solução alternativa é criar uma exibição personalizada: stackoverflow.com/questions/18005111/…Levando a solução um passo adiante. Isso adiciona o operador de comparação.
Use-o em um modelo como este:
Versão Coffee Script
fonte
'||'
e'&&'
. Eu adicionei esses casos e eles são muito úteis.v1 = Ember.Handlebars.get(this, v1, options)
v2 = Ember.Handlebars.get(this, v2, options)
O guidão suporta operações aninhadas. Isso fornece muita flexibilidade (e código mais limpo) se escrevermos nossa lógica de maneira um pouco diferente.
De fato, podemos adicionar todos os tipos de lógica:
Basta registrar estes ajudantes:
fonte
options
execução, é melhor manter oif
método e mais fácil de testar. Obrigado!and
e seusor
ajudantes trabalham apenas com 2 parâmetros, que não é o que você deseja. Eu consegui refazer ambas asand
eor
ajudantes para suportar mais de dois parâmetros. Utilize este one-liner paraand
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).every(Boolean);
e usar este one-liner paraor
:return Array.prototype.slice.call(arguments, 0, arguments.length - 1).some(Boolean);
.levando este a um nível, para aqueles que vivem no limite.
gist : https://gist.github.com/akhoury/9118682 Demo : snippet de código abaixo
Auxiliar do guidão:
{{#xif EXPRESSION}} {{else}} {{/xif}}
um auxiliar para executar uma instrução IF com qualquer expressão
encodeURIComponent(property)
template( {name: 'Sam', age: '20' } )
, o avisoage
é umstring
, apenas para que eu possa demonstrarparseInt()
mais adiante neste postUso:
Resultado
JavaScript: (depende de outro ajudante - continue lendo)
Auxiliar do guidão:
{{x EXPRESSION}}
Um auxiliar para executar expressões javascript
parseInt(property)
template( {name: 'Sam', age: '20' } )
,age
éstring
para fins de demonstração, pode ser qualquer coisa.Uso:
Resultado:
JavaScript:
Parece um pouco grande, porque ampliei a sintaxe e comentei quase todas as linhas para fins de clareza
Moar
se você deseja acessar o escopo de nível superior, este é um pouco diferente, a expressão é JOIN de todos os argumentos, use: say dados de contexto se parecem com isso:
Javascript:
fonte
{{#each}} ... {{xif ' ../name === this.name' }} {{/each}}
... mas eu ainda estou investigando ..{{z ...}}
ajudanteeval(expression);
por este:eval('(function(){try{return ' + expression + ';}catch(e){}})();');
- eu sei que isso está ficando feio, mas não consigo pensar em uma maneira segura de fazer isso - esteja ciente de que isso não é muito "rápido" para executar, eu não faria isso em iteração enorme.Existe uma maneira simples de fazer isso sem escrever uma função auxiliar ... Isso pode ser feito completamente no modelo.
Edit: Por outro lado, você pode fazer ou fazer isso:
Editar / Nota: No site do guiador: handlebarsjs.com, aqui estão os valores de falsidade:
fonte
Um problema com todas as respostas postadas aqui é que elas não funcionam com propriedades associadas, ou seja, a condição if não é reavaliada quando as propriedades envolvidas são alteradas. Aqui está uma versão um pouco mais avançada das ligações de suporte do auxiliar. Ele usa a função de ligação da fonte Ember, que também é usada para implementar o
#if
auxiliar Ember normal .Essa é limitada a uma única propriedade vinculada no lado esquerdo, comparada a uma constante no lado direito, o que eu acho que é bom o suficiente para a maioria dos propósitos práticos. Se você precisar de algo mais avançado do que uma simples comparação, talvez seja bom começar a declarar algumas propriedades calculadas e usar o
#if
auxiliar normal .Você pode usá-lo assim:
fonte
Solução aprimorada que basicamente funciona com qualquer operador binário (pelo menos números, seqüências de caracteres não funcionam bem com eval, CUIDADO COM A INJEÇÃO DE SCRIPT POSSÍVEL SE USAR UM OPERADOR NÃO DEFINIDO COM ENTRADAS DE USUÁRIO):
fonte
Aqui está uma solução se você quiser verificar várias condições:
Uso:
fonte
Aqui está um link para o auxiliar de bloco que eu uso: auxiliar de bloco de comparação . Ele suporta todos os operadores padrão e permite escrever o código como mostrado abaixo. É realmente bastante útil.
fonte
Semelhante à resposta de Jim, mas usando um pouco de criatividade, também podemos fazer algo assim:
Então, para usá-lo, temos algo como:
Eu sugeriria mover o objeto para fora da função para obter melhor desempenho, mas, caso contrário, você poderá adicionar qualquer função de comparação desejada, incluindo "e" e "ou".
fonte
Uma outra alternativa é usar o nome da função em
#if
. Ele#if
detectará se o parâmetro é função e, se for, ele o chamará e usará seu retorno para verificação da verdade. Abaixo myFunction obtém o contexto atual comothis
.fonte
Infelizmente, nenhuma dessas soluções resolve o problema do operador "OR" "cond1 || cond2".
Use "^" (ou) e verifique se, caso contrário, cond2 é verdadeiro
{{#if cond1}} FAÇA A AÇÃO {{^}} {{#if cond2}} FAÇA A AÇÃO {{/ if}} {{/ if}}
Quebra a regra SECA. Então, por que não usar parcial para torná-lo menos confuso
fonte
Entendo por que você desejaria criar um auxiliar para situações em que você tem um grande número de comparações variadas para executar em seu modelo, mas para um número relativamente pequeno de comparações (ou mesmo uma, que foi o que me levou a esta página em em primeiro lugar), provavelmente seria mais fácil definir uma nova variável de guidão em sua chamada de função de renderização de exibição, como:
Passe para o guidão no render:
e depois dentro do seu modelo de guidão:
Menciono isso por uma questão de simplicidade, e também porque é uma resposta que pode ser rápida e útil enquanto ainda cumpre a natureza lógica do guidão.
fonte
Instale o complemento Ember Truth Helpers executando o comando abaixo
você pode começar a usar a maioria dos operadores lógicos (eq, not-eq, not e e, ou, gt, gte, lt, lte, xor).
Você pode até incluir subexpressão para ir além,
fonte
Outra solução distorcida para um ajudante ternário:
Ou um simples auxiliar de coalescência:
Como esses caracteres não têm um significado especial na marcação do guidão, você pode usá-los como nomes auxiliares.
fonte
Eu encontrei um pacote npm feito com o CoffeeScript que tem muitos auxiliares incríveis e úteis para o guidão. Veja a documentação no seguinte URL:
https://npmjs.org/package/handlebars-helpers
Você pode fazer o
wget http://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.2.6.tgz
download deles e ver o conteúdo do pacote.Você será capaz de fazer coisas como
{{#is number 5}}
ou{{formatDate date "%m/%d/%Y"}}
fonte
se você quiser apenas verificar se um ou outro elemento está presente, use este auxiliar personalizado
como isso
se você também precisar ter um "ou" para comparar os valores de retorno da função , prefiro adicionar outra propriedade que retorne o resultado desejado.
Afinal, os modelos não devem ter lógica!
fonte
Para aqueles que têm problemas ao comparar as propriedades do objeto, dentro do auxiliar, adicione esta solução
O auxiliar Ember.js não reconhece corretamente um parâmetro
fonte
Acabei de chegar a este post de uma pesquisa no google sobre como verificar se uma string é igual a outra string.
Uso o HandlebarsJS no NodeJS, mas também os mesmos arquivos de modelo no front-end, usando a versão do navegador do HandlebarsJS para analisá-lo. Isso significava que, se eu quisesse um auxiliar personalizado, teria que defini-lo em 2 lugares separados ou atribuir uma função ao objeto em questão - muito esforço !!
O que as pessoas esquecem é que certos objetos têm funções herdadas que podem ser usadas no modelo de bigode. No caso de uma string:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
An Array containing the entire match result and any parentheses-captured matched results; null if there were no matches.
Podemos usar esse método para retornar uma matriz de correspondências ou
null
se nenhuma correspondência for encontrada. Isso é perfeito, porque olhar para a documentação do HandlebarsJS http://handlebarsjs.com/builtin_helpers.htmlYou can use the if helper to conditionally render a block. If its argument returns false, undefined, null, "", 0, or [], Handlebars will not render the block.
Assim...
ATUALIZAR:
Após o teste em todos os navegadores, isso não funciona no Firefox . O HandlebarsJS passa outros argumentos para uma chamada de função, o que significa que, quando String.prototype.match é chamado, o segundo argumento (ou seja, os sinalizadores Regexp para a chamada de função de correspondência conforme a documentação acima) parece estar sendo passado. O Firefox vê isso como um uso obsoleto de String.prototype.match, e assim quebra.
Uma solução alternativa é declarar um novo protótipo funcional para o objeto String JS e usá-lo:
Verifique se esse código JS está incluído antes de executar sua função Handlebars.compile () e, em seguida, no seu modelo ...
fonte
Aqui temos guidão de baunilha para vários lógicos && e || (e ou):
Não tem tanta certeza se é "seguro" usar "e" e "ou" ... talvez mude para algo como "op_and" e "op_or"?
fonte
Solução correta para AND / OR
Em seguida, ligue da seguinte maneira
BTW: Observe que a solução fornecida aqui está incorreta, ele não está subtraindo o último argumento, que é o nome da função. https://stackoverflow.com/a/31632215/1005607
Seu original AND / OR foi baseado na lista completa de argumentos
Alguém pode mudar essa resposta? Acabei de perder uma hora tentando consertar algo em uma resposta recomendada por 86 pessoas. A correção é filtrar o último argumento, que é o nome da função.
Array.prototype.slice.call(arguments, 0, arguments.length - 1)
fonte
Seguindo esses dois guias, instruções de como definir como customizar o limite de if e os auxiliares de limite personalizados, consegui ajustar minhas visualizações compartilhadas nesta postagem no stackoverflow para usá-lo em vez do padrão # declaração if. Isso deve ser mais seguro do que apenas jogar um #if lá.
Os auxiliares vinculados personalizados nessa essência são excelentes.
Estou usando o projeto ember cli para criar meu aplicativo ember.
Configuração atual no momento desta postagem:
fonte
No Ember.js, você pode usar o auxiliar de linha, se o auxiliar de bloco. Pode substituir
||
o operador lógico, por exemplo:fonte
Você pode fazer isso simplesmente usando o operador lógico como este mostrado abaixo:
Antes de fechar, se você pode escrever sua lógica de negócios
fonte
Você pode usar o seguinte código:
fonte
Aqui está uma abordagem que estou usando para o ember 1.10 e o ember-cli 2.0.
Então você pode usá-lo em seus modelos como este:
Onde os argumentos para a expressão são passados como
p0
,p1
,p2
etc ep0
também pode ser referenciado comothis
.fonte