Apa cara terbaik untuk kondisional menerapkan kelas?

Katakanlah anda memiliki sebuah array yang dituliskan di ul dengan li untuk masing-masing elemen dan properti pada controller yang disebut selectedIndex. Apa yang akan menjadi cara terbaik untuk menambahkan class untuk li dengan index selectedIndex di AngularJS?

Saat ini saya duplikasi (dengan tangan) yang li kode dan menambahkan kelas ke salah satu li kategori dan menggunakan ng-show dan ng-menyembunyikan untuk menunjukkan hanya satu li per indeks.

Mengomentari pertanyaan (2)
Larutan

Jika anda don't ingin menempatkan nama kelas CSS ke Controller seperti yang saya lakukan, berikut ini adalah trik lama yang saya gunakan sejak pra-v1 hari. Kita dapat menulis sebuah ekspresi yang mengevaluasi langsung ke nama kelas dipilih, tidak ada custom arahan yang diperlukan:

ng:class="{true:'selected', false:''}[$index==selectedIndex]"

Mohon perhatikan sintaks tua dengan usus besar.

Ada juga cara yang lebih baik baru menerapkan kelas kondisional, seperti:

ng-class="{selected: $index==selectedIndex}"

Sudut sekarang mendukung ekspresi yang mengembalikan sebuah objek. Masing-masing properti (nama) objek ini sekarang dianggap sebagai nama kelas dan diterapkan tergantung pada nilainya.

Namun cara ini tidak secara fungsional sama. Berikut ini sebuah contoh:

ng-class="{admin:'enabled', moderator:'disabled', '':'hidden'}[user.role]"

Oleh karena itu kita dapat menggunakan kembali CSS yang sudah ada kelas pada dasarnya pemetaan model properti untuk nama kelas dan pada saat yang sama menjaga kelas CSS yang keluar dari Controller code.

Komentar (21)

ng-kelas mendukung ekspresi yang harus mengevaluasi dengan baik

  1. String dibatasi ruang nama kelas, atau
  2. Sebuah array dari nama kelas, atau
  3. Peta/objek dari kelas nama untuk nilai boolean.

Jadi, dengan menggunakan formulir 3) kita hanya bisa menulis

ng-class="{'selected': $index==selectedIndex}"

Lihat juga https://stackoverflow.com/questions/13813254/how-do-i-conditionally-apply-css-styles-in-angularjs untuk jawaban yang lebih luas.


Update: Sudut 1.1.5 telah menambahkan dukungan untuk ternary operator, jadi jika membangun yang lebih akrab untuk anda:

ng-class="($index==selectedIndex) ? 'selected' : ''"
Komentar (2)

Metode favorit saya adalah menggunakan ternary ekspresi.

ng-class="condition ? 'trueClass' : 'falseClass'"

Catatan: Memetikan anda'kembali menggunakan versi lama dari Sudut anda harus menggunakan ini sebagai gantinya,

ng-class="condition && 'trueClass' || 'falseClass'"
Komentar (3)

I'll tambahkan ke ini, karena beberapa dari jawaban-jawaban ini tampak keluar dari tanggal. Berikut ini's bagaimana saya melakukannya:

Mana 'isSelected' adalah variabel javascript yang ditetapkan dalam cakupan sudut controller.


Untuk lebih khusus menjawab pertanyaan anda, berikut ini's bagaimana anda bisa menghasilkan sebuah daftar dengan:

HTML

<div ng-controller="ListCtrl">  
    <li class="ng-class:item.isSelected" ng-repeat="item in list">   
       {{item.name}}
    </li>  
</div>


JS

function ListCtrl($scope) {    
    $scope.list = [  
        {"name": "Item 1", "isSelected": "active"},  
        {"name": "Item 2", "isSelected": ""}
    ]
}


Lihat: http://jsfiddle.net/tTfWM/

Lihat: http://docs.angularjs.org/api/ng.directive:ngClass

Komentar (2)

Berikut ini adalah solusi yang jauh lebih sederhana:

function MyControl($scope){
    $scope.values = ["a","b","c","d","e","f"];
    $scope.selectedIndex = -1;

    $scope.toggleSelect = function(ind){
        if( ind === $scope.selectedIndex ){
            $scope.selectedIndex = -1;
        } else{
            $scope.selectedIndex = ind;
        }
    }

    $scope.getClass = function(ind){
        if( ind === $scope.selectedIndex ){
            return "selected";
        } else{
            return "";
        }
    }

    $scope.getButtonLabel = function(ind){
        if( ind === $scope.selectedIndex ){
            return "Deselect";
        } else{
            return "Select";
        }
    }
}
.selected {
    color:red;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>
<div ng-app ng-controller="MyControl">
    <ul>
        <li ng-class="getClass($index)" ng-repeat="value in values" >{{value}} {{getButtonLabel($index)}}</li>
    </ul>
    <p>Selected: {{selectedIndex}}</p>
</div>
Komentar (3)

Saya menghadapi masalah yang sama baru-baru ini dan memutuskan untuk hanya membuat filter bersyarat:

  angular.module('myFilters', []).
    /**
     * "if" filter
     * Simple filter useful for conditionally applying CSS classes and decouple
     * view from controller 
     */
    filter('if', function() {
      return function(input, value) {
        if (typeof(input) === 'string') {
          input = [input, ''];
        }
        return value? input[0] : input[1];
      };
    });

Dibutuhkan satu argumen yang lebih baik 2-elemen array atau string, yang akan berubah menjadi sebuah array yang ditambahkan string kosong sebagai elemen kedua:

<li ng-repeat="item in products | filter:search | orderBy:orderProp |
  page:pageNum:pageLength" ng-class="'opened'|if:isOpen(item)">
  ...
</li>
Komentar (2)

Jika anda ingin melampaui biner evaluasi dan menjaga CSS anda keluar dari controller anda dapat menerapkan filter sederhana yang mengevaluasi masukan terhadap objek peta:

angular.module('myApp.filters, [])
  .filter('switch', function () { 
      return function (input, map) {
          return map[input] || '';
      }; 
  });

Hal ini memungkinkan anda untuk menulis markup anda seperti ini:

<div ng-class="muppets.star|switch:{'Kermit':'green', 'Miss Piggy': 'pink', 'Animal': 'loud'}">
    ...
</div>
Komentar (2)

Itu baru saja saya lakukan itu melakukan hal ini:

<input type="password"  placeholder="Enter your password"
ng-class="{true: 'form-control isActive', false: 'isNotActive'}[isShowing]">

The isShowing value adalah nilai yang terletak pada controller yang akan diaktifkan dengan klik tombol dan bagian antara satu tanda kurung adalah kelas yang saya buat di file css.

EDIT: saya juga ingin menambahkan bahwa codeschool.com memiliki kursus gratis yang disponsori oleh google pada AngularJS yang berjalan di atas semua hal-hal ini dan kemudian beberapa. Tidak perlu membayar untuk apa-apa, hanya mendaftar untuk sebuah account dan pergi! Best of luck untuk anda semua!

Komentar (2)

Operator Ternary telah ditambahkan ke sudut parser di 1.1.5.

Jadi cara paling sederhana untuk melakukan hal ini sekarang :

ng:class="($index==selectedIndex)? 'selected' : ''"
Komentar (1)

Kita bisa membuat fungsi untuk mengelola kembali kelas dengan kondisi

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    switch(strValue) {
                        case "It is Red":return "Red";break;
                        case "It is Yellow":return "Yellow";break;
                        case "It is Blue":return "Blue";break;
                        case "It is Green":return "Green";break;
                        case "It is Gray":return "Gray";break;
                    }
                }
        }]);
</script>

Dan kemudian



<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>
<hr/>
<p>Other way using : ng-class="{'class1' : expression1, 'class2' : expression2,'class3':expression2,...}"</p>
<ul>
    <li ng-repeat="icolor in MyColors">
        <p ng-class="{'Red':icolor=='It is Red','Yellow':icolor=='It is Yellow','Blue':icolor=='It is Blue','Green':icolor=='It is Green','Gray':icolor=='It is Gray'}" class="b">{{icolor}}</p>
    </li>
</ul>

Anda dapat merujuk ke kode penuh halaman di ng-kelas jika misalnya

Komentar (0)

Saya baru ke Sudut tetapi telah menemukan ini untuk memecahkan masalah saya:

Ini akan kondisional menerapkan kelas berbasis pada var. Ini dimulai dengan icon-download sebagai default, menggunakan ng-kelas, saya memeriksa status showDetails jika true/false dan menerapkan kelas ikon-upload. Kerja besar.

Semoga membantu.

Komentar (0)

Ini bekerja seperti pesona ;)

<ul class="nav nav-pills" ng-init="selectedType = 'return'">
    <li role="presentation" ng-class="{'active':selectedType === 'return'}"
        ng-click="selectedType = 'return'"><a href="#return">return

    </a></li>
    <li role="presentation" ng-class="{'active':selectedType === 'oneway'}"
        ng-click="selectedType = 'oneway'"><a href="#oneway">oneway
    </a></li>
</ul>
Komentar (0)

Ini mungkin akan mendapatkan downvoted untuk dilupakan, tapi di sini adalah bagaimana saya digunakan 1.1.5's ternary operator untuk beralih kelas tergantung pada apakah sebuah baris dalam tabel adalah yang pertama, di tengah atau di akhir -- kecuali jika hanya ada satu baris dalam tabel:

<span class="attribute-row" ng-class="(restaurant.Attributes.length === 1) || ($first ? 'attribute-first-row': false || $middle ? 'attribute-middle-row': false || $last ? 'attribute-last-row': false)">
</span>
Komentar (0)

Ini adalah pekerjaan saya beberapa persyaratan hakim:

<li ng-repeat='eOption in exam.examOptions' ng-class="exam.examTitle.ANSWER_COM==exam.examTitle.RIGHT_ANSWER?(eOption.eoSequence==exam.examTitle.ANSWER_COM?'right':''):eOption.eoSequence==exam.examTitle.ANSWER_COM?'wrong':eOption.eoSequence==exam.examTitle.RIGHT_ANSWER?'right':''">
  <strong>{{eOption.eoSequence}}</strong>     |    
  <span ng-bind-html="eOption.eoName | to_trusted">2020 元</span>
</li>
Komentar (0)

parsial

  <div class="col-md-4 text-right">
      <a ng-class="campaign_range === 'thismonth' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("thismonth")'>This Month</a>
      <a ng-class="campaign_range === 'all' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("all")'>All Time</a>
  </div>

controller

  $scope.campaign_range = "all";
  $scope.change_range = function(range) { 
        if (range === "all")
        {
            $scope.campaign_range = "all"
        }
        else
        {  
            $scope.campaign_range = "thismonth"
        }
  };
Komentar (0)

nah saya akan menyarankan anda untuk memeriksa kondisi di controller dengan fungsi kembali sejati atau palsu .

<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>

dan di controller memeriksa kondisi

$scope.getTodayForHighLight = function(today, date){
return (today == date);
}
Komentar (0)

Berikut adalah pilihan lain yang bekerja dengan baik ketika ng-kelas dapat't yang akan digunakan (misalnya ketika styling SVG):

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

(Saya pikir anda harus paling tidak stabil Sudut untuk menggunakan ng-ora-, I'm saat ini di 1.1.4)

Komentar (0)

Hanya menambahkan sesuatu yang bekerja untuk saya hari ini, setelah banyak mencari...

<div class="form-group" ng-class="{true: 'has-error'}[ctrl.submitted && myForm.myField.$error.required]">

Semoga ini bisa membantu anda sukses pembangunan.

=)

Berdokumen Ekspresi Sintaks : Website Link... =)

Komentar (1)

Cek http://www.codinginsight.com/angularjs-if-else-statement/

Terkenal angularjs jika pernyataan lain!!! Ketika saya mulai menggunakan Angularjs, saya sedikit terkejut bahwa saya tidak bisa menemukan jika pernyataan/lain.

Jadi saya bekerja pada sebuah proyek dan saya melihat bahwa ketika menggunakan if/else pernyataan, kondisi tersebut menunjukkan saat loading. Anda dapat menggunakan ng-jubah untuk memperbaiki hal ini.

<div class="ng-cloak">
 <p ng-show="statement">Show this line</span>
 <p ng-hide="statement">Show this line instead</span>
</div>

.ng-jubah { display: none }

Terima kasih amadou

Komentar (0)

Jika anda memiliki sebuah kelas umum yang diterapkan untuk banyak elemen yang anda dapat membuat kustom, petunjuk yang akan menambah kelas yang suka ng-show/ng-sembunyi.

Direktif ini akan menambah kelas 'aktif' untuk tombol jika itu's diklik

module.directive('ngActive',  ['$animate', function($animate) {
  return function(scope, element, attr) {
    scope.$watch(attr.ngActive, function ngActiveWatchAction(value){
      $animate[value ? 'addClass' : 'removeClass'](element, 'active');
    });
  };
}]);

info Lebih lanjut

Komentar (0)