Operator trójskładnikowy w szablonach AngularJS


Odpowiedzi:


374

Aktualizacja : Angular 1.1.5 dodał operator trójskładnikowy , więc teraz możemy po prostu pisać

<li ng-class="$first ? 'firstRow' : 'nonFirstRow'">

Jeśli używasz wcześniejszej wersji Angulara, masz dwie możliwości:

  1. (condition && result_if_true || !condition && result_if_false)
  2. {true: 'result_if_true', false: 'result_if_false'}[condition]

punkt 2. powyżej tworzy obiekt o dwóch właściwościach. Składnia tablicowa służy do wyboru właściwości o nazwie true lub właściwości o nazwie false i zwracania powiązanej wartości.

Na przykład,

<li class="{{{true: 'myClass1 myClass2', false: ''}[$first]}}">...</li>
 or
<li ng-class="{true: 'myClass1 myClass2', false: ''}[$first]">...</li>

$ first jest ustawione na true w powtórzeniu ng dla pierwszego elementu, więc powyższe zastosuje klasy „myClass1” i „myClass2” tylko za pierwszym razem przez pętlę.

Z klasą ng jest jednak łatwiejszy sposób: klasa-ng przyjmuje wyrażenie, które musi być ocenione na jedno z poniższych:

  1. ciąg nazw klas rozdzielanych spacjami
  2. tablica nazw klas
  3. mapa / obiekt nazw klas na wartości boolowskie.

Przykład 1) podano powyżej. Oto przykład 3, który moim zdaniem brzmi znacznie lepiej:

 <li ng-class="{myClass: $first, anotherClass: $index == 2}">...</li>

Za pierwszym razem poprzez pętlę powtarzania ng dodawana jest klasa myClass. Za trzecim razem ($ index zaczyna się od 0), klasa anotherClass jest dodawana.

ng-style przyjmuje wyrażenie, które musi być przetwarzane na mapę / obiekt nazw stylów CSS na wartości CSS. Na przykład,

 <li ng-style="{true: {color: 'red'}, false: {}}[$first]">...</li>

6
Gdybym mógł, chciałbym ponownie zagłosować za aktualizację pytania!
Narretz

2
Zajmę się tym, @Narretz.
Ian Hunter,

1
W przykładzie dostępu do klucza obiektowego możesz pominąć klucz „false”, ponieważ i tak jest to pusty ciąg.
0xc0de

Słowo ostrzeżenia 1.1.5 nie jest obecnie stabilne.
Adam Grant

Co się stanie, jeśli warunki warunkowe zmienią się po aktualizacji modelu? Chciałbym ng-stylezaktualizować, ale wydaje się, że jest oceniany tylko przy pierwszym renderowaniu elementu. (Angular noob tutaj)
Hartley Brody

86

Aktualizacja: Angular 1.1.5 dodał operator trójskładnikowy, ta odpowiedź jest poprawna tylko dla wersji wcześniejszych niż 1.1.5. W wersji 1.1.5 i nowszych zobacz aktualnie przyjętą odpowiedź.

Przed Angular 1.1.5:

Forma trójki w angularjs jest:

((condition) && (answer if true) || (answer if false))

Przykładem może być:

<ul class="nav">
    <li>
        <a   href="#/page1" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Goals</a>
    </li>
    <li>
        <a   href="#/page2" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Groups</a>
    </li>
</ul>

lub:

 <li  ng-disabled="currentPage == 0" ng-click="currentPage=0"  class="{{(currentPage == 0) && 'disabled' || ''}}"><a> << </a></li>

1
Dziwne. To nie jest bardzo intuicyjne. Zastanawiam się, dlaczego został zaimplementowany w ten sposób.
Ben Lesh

4
Ternary nigdy nie został wdrożony, ale wykorzystuje to po prostu operatory binarne.
Andrew Joslin,

18
@ rozwiązywanie problemów, AngularJS promuje testowalność. Szablony nie powinny zawierać żadnej logiki. Operator trójskładnikowy w szablonie powinien zostać refaktoryzowany do wywołania funkcji do kontrolera, dla lepszej testowalności.
Marcello Nuccio,

1
@ arg20 powinieneś użyć dyrektywy ngClass (lub ngClassEven i ngClassOdd). Następnie umieść całą logikę wyboru klas css w kontrolerze. Jest to o wiele łatwiejsze do automatycznego przetestowania.
Marcello Nuccio,

1
@ arg20 Powiedziałem, aby umieścić go w kontrolerze, a nie w modelu. To nie powinno stanowić problemu. Jednak dokumentacja mówi: „Wynikiem oceny może być ciąg znaków reprezentujący nazwy klas rozdzielane spacjami, tablicę lub mapę nazw klas do wartości boolowskich”. Oznacza to, że możesz użyć „{cssclass: someBoolCheck ()}” jako wyrażenia, tzn. Umieścisz klasę css w widoku, a logikę w kontrolerze. Spójrz na ten jsFiddle na przykład.
Marcello Nuccio,

23

W przypadku tekstów w szablonie kątowym ( userTypejest własnością $ scope, jak $ scope.userType):

<span>
  {{userType=='admin' ? 'Edit' : 'Show'}}
</span>

11

Do tej pory wszyscy odkryliśmy, że wersja 1.1.5 ma odpowiednią trójkę w $parsefunkcji, więc użyj tej odpowiedzi jako przykładu filtrów:

angular.module('myApp.filters', [])

  .filter('conditional', function() {
    return function(condition, ifTrue, ifFalse) {
      return condition ? ifTrue : ifFalse;
    };
  });

A następnie użyj go jako

<i ng-class="checked | conditional:'icon-check':'icon-check-empty'"></i>

2
Przyszedłem do tego pytania dla operatora trójskładnikowego, ale na końcu poszedłem z filtrem i czułem się naprawdę dobrze ... = D
slacktracer 30.10.2013

10

Oto on: operator trójkowy został dodany do parsera kątowego w 1.1.5 ! zobacz dziennik zmian

Oto skrzypce pokazujące nowego trójskładnikowego operatora stosowanego w dyrektywie klasy ng.

ng-class="boolForTernary ? 'blue' : 'red'"


0
  <body ng-app="app">
  <button type="button" ng-click="showme==true ? !showme :showme;message='Cancel Quiz'"  class="btn btn-default">{{showme==true ? 'Cancel Quiz': 'Take a Quiz'}}</button>
    <div ng-show="showme" class="panel panel-primary col-sm-4" style="margin-left:250px;">
      <div class="panel-heading">Take Quiz</div>
      <div class="form-group col-sm-8 form-inline" style="margin-top: 30px;margin-bottom: 30px;">

        <button type="button" class="btn btn-default">Start Quiz</button>
      </div>
    </div>
  </body>

Przycisk przełącza i zmienia nagłówek przycisku oraz wyświetla / ukrywa panel div. Zobacz Plunkr

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.