AngularJS ng-style con una expresión condicional

267

Estoy manejando mi problema de esta manera:

ng-style="{ width: getTheValue() }"

Pero para evitar tener esta función en el lado del controlador, preferiría hacer algo como esto:

ng-style="{ width: myObject.value == 'ok' ? '100%' : '0%' }"

¿Cómo puedo hacer esto?

TigrouMeow
fuente
17
¿Qué versión de angular estás usando? Al menos con 1.1.5 esto es posible sin ningún cambio. demo
Yoshi
Estoy usando 1.0.8 :) Oh, qué pena, debería intentar actualizar entonces ... ¡gracias!
TigrouMeow
44
Aunque con 1.1.5 su código está funcionando, si usa otras propiedades de estilo en lugar de ancho (por ejemplo, tamaño de fuente) su código no funcionará hasta que lo cambie a: ng-style = "{ 'font-size' : myObject.value == 'ok'? '20px': '10px'} "(debe rodear la propiedad de estilo con comillas).
BornToCode
No sé si esto es útil, pero para los recién llegados puedes usar ng style con un objeto, pero así ng-style = "objectBit? {'Border': '1px solid red'}: {'border': 'none'}"
Usman I

Respuestas:

124

Como dijo @Yoshi, desde angular 1.1.5 puede usarlo sin ningún cambio.

Si usa angular <1.1.5, puede usar ng-class .

.largeWidth {
    width: 100%;
}

.smallWidth {
    width: 0%;
}

// [...]

ng-class="{largeWidth: myVar == 'ok', smallWidth: myVar != 'ok'}"
Vianney Dupoy de Guitard
fuente
3
¡Bien gracias! Me preguntaba si había una manera de hacerlo sin usar ninguna clase, pero todo directamente usando Angular en la plantilla.
TigrouMeow
1
¿Cómo usar esto para más de un nombre de clase?
Thanigainathan
3
¿Y si estoy usando angular> 1.1.5?
bigpony
14
Esto no responde exactamente la pregunta.
Lee
1
Esta pregunta literalmente pide un ejemplo con ng-style y la respuesta aceptada con más de 100 votos no proporciona eso.
JWiley
361

ejemplo simple:

<div ng-style="isTrue && {'background-color':'green'} || {'background-color': 'blue'}" style="width:200px;height:100px;border:1px solid gray;"></div>

{'background-color': 'green'} RETURN true

O el mismo resultado:

<div ng-style="isTrue && {'background-color':'green'}" style="width:200px;height:100px;border:1px solid gray;background-color: blue"></div>

Otra posibilidad condicional:

<div ng-style="count === 0 && {'background-color':'green'}  || count === 1 && {'background-color':'yellow'}" style="width:200px;height:100px;border:1px solid gray;background-color: blue"></div>
Arthur Tsidkilov
fuente
¿Cómo podría lograr esto pero con múltiples estilos / condiciones independientes? Gracias, gran respuesta por cierto.
Adam Plocher
@Arthur su ejemplo se va a verificar isTrue y {'background-color':'green'} O solo se va a verificar isTruey se background explicará cómo funcionará, ¿puede explicar a alguien?
Rajnish Rajput
1
@ rajnish-rajput va a verificar isTrue y colocar el fondo, {'background-color': 'green'} por defecto devuelve true como un objeto de estilo
Arthur Tsidkilov
100

Puedes lograrlo así:

ng-style="{ 'width' : (myObject.value == 'ok') ? '100%' : '0%' }"
jfredsilva
fuente
43

@jfredsilva obviamente tiene la respuesta más simple para la pregunta:

ng-style = "{'width': (myObject.value == 'ok')? '100%': '0%'}"

Sin embargo, es posible que desee considerar mi respuesta para algo más complejo.

Ejemplo ternario:

<p ng-style="{width: {true:'100%',false:'0%'}[myObject.value == 'ok']}"></p>

Algo más complejo:

<p ng-style="{
   color:       {blueish: 'blue', greenish: 'green'}[ color ], 
  'font-size':  {0: '12px', 1: '18px', 2: '26px'}[ zoom ]
}">Test</p>

Si $scope.color == 'blueish' , el color será 'azul'.

Si $scope.zoom == 2, el tamaño de fuente será 26px.

angular.module('app',[]);
function MyCtrl($scope) {
  $scope.color = 'blueish';
  $scope.zoom = 2;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>
<div ng-app="app" ng-controller="MyCtrl" ng-style="{
   color:       {blueish: 'blue', greenish: 'green'}[ color ], 
  'font-size':  {0: '12px', 1: '18px', 2: '26px'}[ zoom ]
}">
  color = {{color}}<br>
  zoom = {{zoom}}
</div>

Equipo
fuente
sintaxis interesante {<value>:'<string>'}[<$scope.var>]}, ¿de dónde viene?
netalex
10

si quieres usar con expresión, la forma correcta es:

<span class="ng-style: yourCondition && {color:'red'};">Sample Text</span>

pero la mejor manera es usar ng-class

Lucas Roselli
fuente
Syntax Error: Token '%3A' is%20an%20unexpected%20token at column 9 of the expression [ng-style%3A%...
Z. Khullah
9

En una nota genérica, puede usar una combinación ng-ife ng-styleincorporar cambios condicionales con cambios en la imagen de fondo.

<span ng-if="selectedItem==item.id"
              ng-style="{'background-image':'url(../images/'+'{{item.id}}'+'_active.png)','background-size':'52px 57px','padding-top':'70px','background-repeat':'no-repeat','background-position': 'center'}"></span>
        <span ng-if="selectedItem!=item.id"
              ng-style="{'background-image':'url(../images/'+'{{item.id}}'+'_deactivated.png)','background-size':'52px 57px','padding-top':'70px','background-repeat':'no-repeat','background-position': 'center'}"></span>
TS Shriram
fuente
Esto me causó un Uncaught Error: Template parse errors: Can't bind to 'ng-style' since it isn't a known property of 'div'error
Serj Sagan
6

Para una sola propiedad css

ng-style="1==1 && {'color':'red'}"

Para múltiples propiedades CSS a continuación se puede referir

ng-style="1==1 && {'color':'red','font-style': 'italic'}"

Reemplace 1 == 1 con su expresión de condición

Siddhartha
fuente
4

También esta sintaxis para el operador ternario funcionará:

  ng-style="<$scope.var><condition> ? {
        '<css-prop-1>':((<value>) / (<value2>)*100)+'%',
        '<css-prop-2>':'<string>'
      } : {
        '<css-prop-1>':'<string>',
        '<css-prop-2>':'<string>'
      }"

donde <value>están los valores de propiedad $ scope. Por ejemplo:

ng-style="column.histograms.value=>0 ? 
  {
    'width':((column.histograms.value) / (column.histograms.limit)*100)+'%',
    'background':'#F03040'
  } : {
    'width':'1px',
    'background':'#2E92FA'
  }"

`` `

esto permite un cálculo en los valores de propiedad css.

netalex
fuente
3

Estoy haciendo lo siguiente para condiciones múltiples e independientes y funciona a las mil maravillas:

<div ng-style="{{valueFromJS}} === 'Hello' ? {'color': 'red'} : {'color': ''} && valueFromNG-Repeat === '{{dayOfToday}}' ? {'font-weight': 'bold'} : {'font-weight': 'normal'}"></div>
Vikasdeep Singh
fuente
2

Estoy usando ng-class para agregar estilo: -

 ng-class="column.label=='Description'  ? 'tableStyle':                     
           column.label == 'Markdown Type' ? 'Mtype' : 
           column.label == 'Coupon Number' ? 'couponNur' :  ''
           "

Uso del operador ternario junto con directivas de clase ng en angular.js para dar estilo. A continuación, defina el estilo de clase en .css o .scss archivo. P.ej :-

.Mtype{
       width: 90px !important;
       min-width: 90px !important;
       max-width: 90px !important;
      }
.tableStyle{
         width: 129px !important;
         min-width: 129px !important;
         max-width: 129px !important;
}
.couponNur{
         width: 250px !important;
         min-width: 250px !important;
         max-width: 250px !important;
}
Cabeza y cola
fuente
-1

No estoy seguro de cómo funciona para ustedes, pero en Angular 9 tengo que poner ngStyle entre paréntesis de esta manera:

[ng-style]="{ 'width' : (myObject.value == 'ok') ? '100%' : '0%' }"

De lo contrario no funciona

FH
fuente