Eu preciso ser capaz de adicionar, por exemplo, "contenteditable" aos elementos, com base em uma variável booleana no escopo.
Exemplo de uso:
<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>
Resultaria na adição de contenteditable = true ao elemento se $scope.editMode
estivesse definido como true
. Existe alguma maneira fácil de implementar esse comportamento de atributo da classe ng? Estou pensando em escrever uma diretiva e compartilhar, se não.
Edit: Eu posso ver que parece haver algumas semelhanças entre minha diretiva attrs proposta e ng-bind-attrs, mas ela foi removida em 1.0.0.rc3 , por que?
angularjs
angularjs-directive
Kenneth Lynne
fonte
fonte
ng-attr="expression"
.contentEditable
diretiva.<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
Respostas:
Estou usando o seguinte para definir condicionalmente a classe attr quando a classe ng não puder ser usada (por exemplo, ao estilizar SVG):
A mesma abordagem deve funcionar para outros tipos de atributos.
(Eu acho que você precisa estar no mais recente Angular instável para usar ng-attr-, atualmente estou no 1.1.4)
fonte
ng-attr-
, o compilador retirará o prefixo e adicionará o atributo com seu valor vinculado ao resultado da expressão angular do valor do atributo original.Você pode prefixar atributos com
ng-attr
para avaliar uma expressão Angular. Quando o resultado das expressões indefinidas, isso remove o valor do atributoProduzirá (quando o valor for falso)
Portanto, não use,
false
porque isso produzirá a palavra "false" como o valor.Ao usar esse truque em uma diretiva. Os atributos para a diretiva serão falsos se estiverem faltando um valor.
Por exemplo, o acima seria falso.
fonte
undefined
é um caso especial. "Ao usar ngAttr, o sinalizador allOrNothing de $ interpolate é usado; portanto, se qualquer expressão na sequência interpolada resultar em indefinida, o atributo será removido e não será adicionado ao elemento."ng-attr-foo
ainda sempre invocará afoo
diretiva, se existir, aténg-attr-foo
avalia comoundefined
. discussãoEu consegui isso trabalhando definindo muito bem o atributo. E controlando a aplicabilidade do atributo usando o valor booleano do atributo.
Aqui está o trecho de código:
Eu espero que isso ajude.
fonte
Na versão mais recente do Angular (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
<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ng-if
cria um novo escopo.ng-if
cria um novo escopo, masng-show
não. Essa inconsistência sempre foi um ponto dolorido para mim. A reação defensiva da programação a isso é: "sempre ligue a algo que seja um ponto na expressão" e isso não será um problema.Para obter um atributo para mostrar um valor específico com base em uma verificação booleana ou ser totalmente omitido se a verificação booleana falhar, usei o seguinte:
ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"
Exemplo de uso:
<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">
Saída
<div class="itWasTest">
ou com<div>
base no valor deparams.type
fonte
<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>
produzirá quando isTrue = true:
<h1 contenteditable="true">{{content.title}}</h1>
e quando isTrue = false:
<h1>{{content.title}}</h1>
fonte
<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
Em relação à solução aceita, a postada por Ashley Davis, o método descrito ainda imprime o atributo no DOM, independentemente do fato de que o valor que foi atribuído é indefinido.
Por exemplo, em uma configuração de campo de entrada com um atributo ng-model e value:
Independentemente do que está por trás do myValue, o atributo value ainda é impresso no DOM, portanto, interpretado. O modelo Ng então é substituído.
Um pouco desagradável, mas usar ng-if faz o truque:
Eu recomendaria usar uma verificação mais detalhada dentro das diretivas ng-if :)
fonte
Além disso, você pode usar uma expressão como esta:
fonte
Na verdade, eu escrevi um patch para fazer isso alguns meses atrás (depois que alguém perguntou sobre isso no #angularjs no freenode).
Provavelmente não será mesclado, mas é muito semelhante ao ngClass: https://github.com/angular/angular.js/pull/4269
Seja mesclado ou não, o material ng-attr- * existente provavelmente é adequado às suas necessidades (como outros já mencionaram), embora possa ser um pouco mais complicado do que a funcionalidade do estilo ngClass que você está sugerindo.
fonte
Para validação de campo de entrada, você pode:
Isto irá aplicar o atributo
max
de100
somente sediscountType
é definido como%
fonte
Editar : Esta resposta está relacionada ao Angular2 +! Desculpe, eu perdi a etiqueta!
Resposta original:
Quanto ao caso muito simples em que você deseja aplicar (ou configurar) apenas um atributo se um determinado valor de Entrada foi definido, é tão fácil quanto
É o mesmo que:
(O valor opcional é aplicado se fornecido, caso contrário, a expressão será falsa e o atributo não será aplicado.)
Exemplo: eu tive o caso, onde permiti aplicar uma cor, mas também estilos arbitrários, em que o atributo color não funcionou como já estava definido (mesmo que a cor @Input () não tenha sido fornecida):
Portanto, "style.color" foi definido apenas quando o atributo color estava presente, caso contrário, o atributo color na string "styles" poderia ser usado.
Obviamente, isso também pode ser alcançado com
e
fonte
No caso de você precisar de uma solução para o Angular 2, então é simples, use a vinculação de propriedades como abaixo; por exemplo, você deseja fazer com que a entrada seja lida apenas condicionalmente e, em seguida, adicione entre colchetes o atributo seguido por = sinal e expressão.
fonte
Conseguiu fazer isso funcionar:
O bom aqui é que, se item.isSelected for false, o atributo simplesmente não será renderizado.
fonte