Styl AngularJS ng z wyrażeniem warunkowym

267

Zajmuję się moim problemem w ten sposób:

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

Ale aby uniknąć tej funkcji po stronie kontrolera, wolałbym zrobić coś takiego:

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

W jaki sposób mogę to zrobić?

TigrouMeow
źródło
17
jakiej wersji kątowej używasz? Przynajmniej w wersji 1.1.5 jest to możliwe bez żadnych zmian. demo
Yoshi
Korzystam z wersji 1.0.8 :) O szkoda, naprawdę powinienem spróbować zaktualizować to ... dzięki!
TigrouMeow
4
Chociaż w wersji 1.1.5 kod działa, to jeśli użyjesz innych właściwości stylu zamiast szerokości (np. Rozmiar czcionki), twój kod nie będzie działał, dopóki nie zmienisz go na: ng-style = "{ 'font-size' : myObject.value == 'ok'? '20px': '10px'} ”(musi otaczać właściwość stylu cudzysłowami).
BornToCode,
Nie wiem, czy to jest pomocne, ale dla początkujących możesz używać stylu ng z obiektem, ale tak jak ten ng-style = "objectBit? {'Border': '1px solid red'}: {'border': 'none'}”
Usman I

Odpowiedzi:

124

Jak powiedział @Yoshi, z kątownika 1.1.5 możesz go używać bez żadnych zmian.

Jeśli używasz kąta <1.1.5, możesz użyć klasy ng .

.largeWidth {
    width: 100%;
}

.smallWidth {
    width: 0%;
}

// [...]

ng-class="{largeWidth: myVar == 'ok', smallWidth: myVar != 'ok'}"
Vianney Dupoy de Guitard
źródło
3
Ok, dzięki! Zastanawiałem się tylko, czy można to zrobić bez użycia klas, ale wszystko bezpośrednio przy użyciu Angulara na szablonie.
TigrouMeow
1
Jak użyć tego dla więcej niż jednej nazwy klasy?
Thanigainathan
3
A jeśli używam kątowej> 1.1.5?
bigpony
14
To nie odpowiada dokładnie na pytanie.
Lee,
1
To pytanie dosłownie prosi o przykład w stylu ng, a zaakceptowana odpowiedź z ponad 100 głosami tego nie zapewnia.
JWiley
361

prosty przykład:

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

{„kolor tła”: „zielony”} POWRÓT true

LUB ten sam wynik:

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

inna możliwość warunkowa:

<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
źródło
Jak mogę to osiągnąć, ale stosując wiele niezależnych stylów / warunków? Dzięki, świetna odpowiedź btw.
Adam Plocher,
@Arthur twój przykład sprawdzi, isTrue a {'background-color':'green'} LUB sprawdzi tylko isTruei pokaże, background jak będzie działać, proszę wyjaśnić komukolwiek?
Rajnish Rajput
1
@ rajnish-rajput sprawdzi isTrue i umieści tło, {'background-color': 'green'} domyślnie zwraca true jako obiekt stylu
Arthur Tsidkilov
100

Możesz to osiągnąć w następujący sposób:

ng-style="{ 'width' : (myObject.value == 'ok') ? '100%' : '0%' }"
jfredsilva
źródło
43

@ jfredsilva ma oczywiście najprostszą odpowiedź na pytanie:

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

Jednak naprawdę możesz rozważyć moją odpowiedź na coś bardziej złożonego.

Przykład trójskładnikowy:

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

Coś bardziej złożonego:

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

Jeśli $scope.color == 'blueish'kolor będzie „niebieski”.

Jeśli $scope.zoom == 2rozmiar czcionki to 26 pikseli.

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>

Zestaw
źródło
ciekawa składnia {<value>:'<string>'}[<$scope.var>]}, skąd pochodzi?
netalex,
10

jeśli chcesz używać wyrażenia, sztywny sposób to:

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

ale najlepszym sposobem jest użycie klasy ng

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

Ogólnie można użyć kombinacji ng-ifi ng-styleuwzględnić zmiany warunkowe wraz ze zmianą obrazu tła.

<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
źródło
To spowodowało Uncaught Error: Template parse errors: Can't bind to 'ng-style' since it isn't a known property of 'div'błąd
Serj Sagan
6

Dla pojedynczej właściwości css

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

W przypadku wielu właściwości css można odwołać się poniżej

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

Zamień 1 == 1 na wyrażenie warunkowe

Siddhartha
źródło
4

działa również ta składnia dla operatora trójskładnikowego:

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

gdzie <value>są wartości właściwości $ scope. W przykładzie:

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

``

pozwala to na pewne obliczenia wartości właściwości css.

netalex
źródło
3

Robię jak poniżej dla wielu niezależnych warunków i działa jak urok:

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

Używam klasy ng do dodawania stylu: -

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

Użycie operatora trójskładnikowego wraz z dyrektywami klasy ng w angular.js do nadania stylu. Następnie określ styl klasy w pliku .css lub .scss . Np .: -

.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;
}
HeadAndTail
źródło
-1

Nie jestem pewien, jak to działa dla was, ale w Angular 9 muszę owinąć ngStyle w nawiasy:

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

W przeciwnym razie to nie działa

FH
źródło