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?


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'}"

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>

¿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%' }"

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>


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


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>

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


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.


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>

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;
}

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.