Eu quero fazer uma condição em um modelo AngularJS. Busco uma lista de vídeos da API do YouTube. Alguns vídeos estão na proporção 16: 9 e outros na proporção 4: 3.
Eu quero fazer uma condição como esta:
if video.yt$aspectRatio equals widescreen then
element's attr height="270px"
else
element's attr height="360px"
Estou repetindo os vídeos usando ng-repeat
. Não tenho idéia do que devo fazer para esta condição:
- Adicionar uma função no escopo?
- Faça isso no modelo?
if-statement
angularjs
vzhen
fonte
fonte
Respostas:
O Angularjs (versões abaixo da 1.1.5) não fornece a
if/else
funcionalidade. A seguir, algumas opções a serem consideradas para o que você deseja alcançar:( Salte para a atualização abaixo (# 5) se você estiver usando a versão 1.1.5 ou superior )
1. Operador ternário:
Conforme sugerido por @Kirk nos comentários, a maneira mais limpa de fazer isso seria usar um operador ternário da seguinte maneira:
2.
ng-switch
directiva:pode ser usado algo como o seguinte.
3.
ng-hide
/ng-show
diretivasComo alternativa, você também pode usar,
ng-show/ng-hide
mas usá-lo na verdade renderiza um vídeo grande e um pequeno elemento de vídeo e depois oculta o que atende àng-hide
condição e mostra o que atendeng-show
condição. Então, em cada página, você estará renderizando dois elementos diferentes.4. Outra opção a considerar é a
ng-class
diretiva.Isso pode ser usado da seguinte maneira.
O exemplo acima basicamente adicionará uma
large-video
classe css ao elemento div, sevideo.large
for verdade.UPDATE: Angular 1.1.5 introduziu o
ngIf directive
5.
ng-if
directiva:Nas versões acima,
1.1.5
você pode usar ang-if
diretiva. Isso removeria o elemento se a expressão fornecida retornarfalse
e reinserir oelement
no DOM se a expressão retornartrue
. Pode ser usado da seguinte maneira.fonte
ng-switch on="video"
em vezng-switch-on="video"
<span>{{isAdded ? 'Added' : 'Add to cart'}}</span>
ng-if
NÃO incluirá os elementos incluídos no DOM até que sua condição seja avaliada comotrue
, ao contrário deng-hide
eng-show
.ng-switch="video"
? Algum problema? ou não estava disponível anteriormente? Para mim, isso está funcionando muito bemNa versão mais recente do Angular (a partir do 1.1.5), eles incluíram uma diretiva condicional chamada
ngIf
. É diferentengShow
engHide
porque os elementos não estão ocultos, mas não estão incluídos no DOM. Eles são muito úteis para componentes que são caros de criar, mas não são usados:fonte
ng-if
apresenta um escopo isolado , para que ele$parent
se torne$parent.$parent
no corpo deng-if
.Ternário é a maneira mais clara de fazer isso.
fonte
O próprio Angular não fornece a funcionalidade if / else, mas você pode obtê-lo incluindo este módulo:
https://github.com/zachsnow/ng-elif
Em suas próprias palavras, é apenas "uma coleção simples de diretrizes de fluxo de controle: ng-if, ng-else-if e ng-else". É fácil e intuitivo de usar.
Exemplo:
fonte
ng-if="someCondition && someOtherCondition"
. Talvez eu entenda mal? (Eu escrevi esse módulo - ele deve funcionar apenas comoif
eelse
em JS).Você pode usar sua
video.yt$aspectRatio
propriedade diretamente passando-a por um filtro e vinculando o resultado ao atributo height no seu modelo.Seu filtro seria algo como:
E o modelo seria:
fonte
video.yt$aspectRatio
está vazio ou indefinido? É possível aplicar um valor padrão?Nesse caso, você deseja "calcular" um valor de pixel, dependendo da propriedade de um objeto.
Eu definiria uma função no controlador que calcula os valores de pixel.
No controlador:
Então, no seu modelo, você acabou de escrever:
fonte
Concordo que um ternário é extremamente limpo. Parece que é muito situacional, mas, como algumas coisas, eu preciso exibir div ou p ou tabela; portanto, com uma tabela, não prefiro um ternário por razões óbvias. Fazer uma chamada para uma função é normalmente ideal ou, no meu caso, fiz o seguinte:
fonte
você pode usar a diretiva ng-if como acima.
fonte
Uma possibilidade para o Angular: eu tive que incluir uma instrução if na parte html, tive que verificar se todas as variáveis de uma URL que produzi estão definidas. Fiz da seguinte maneira e parece ser uma abordagem flexível. Espero que seja útil para alguém.
A parte html no modelo:
E a parte datilografada:
Obrigado e cumprimentos,
Jan
fonte
ng If else
fonte