ng-click kullanarak angularJs'de sınıflar ekleme ve kaldırma


97

NgClick ile nasıl sınıf ekleyeceğime çalışıyorum. Kodumu plunker'a yükledim Buraya tıklayın . Açısal belgelere baktığımda tam olarak nasıl yapılması gerektiğini bulamıyorum. Aşağıda kodumun bir parçası var. Biri bana doğru yönde rehberlik edebilir mi

 <div ng-show="isVisible" ng-class="{'selected': $index==selectedIndex}" class="block"></div>

Kontrolör

var app = angular.module("MyApp", []);
app.controller("subNavController", function ($scope){

        $scope.toggle = function (){
            $scope.isVisible = ! $scope.isVisible;
        };

        $scope.isVisible = false;
    });

Demodan veya açıklamadan amacın ne olduğu net değil. Bir menüyü değiştirmeye çalışıyor gibi görünüyorsunuz, ancak neden sadece demodaki menü bağlantısını değiştiriyorsunuz?
charlietfl

Yanıtlar:


110

Bir değişkeni "ng sınıfı" yönergesine bağlamanız ve onu denetleyiciden değiştirmeniz yeterlidir. İşte bunun nasıl yapılacağına dair bir örnek:

var app = angular.module("ap",[]);

app.controller("con",function($scope){
  $scope.class = "red";
  $scope.changeClass = function(){
    if ($scope.class === "red")
      $scope.class = "blue";
    else
      $scope.class = "red";
  };
});
.red{
  color:red;
}

.blue{
  color:blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="ap" ng-controller="con">
  <div ng-class="class">{{class}}</div>
  <button ng-click="changeClass()">Change Class</button>    
</body>

İşte jsFiddle üzerinde çalışan örnek


29
classayrılmış bir kelimedir, classNamebunun yerine kullanın, YUI derleyicisi bunu küçültmede başarısız olacaktır.
Orlando

7
Bu kodu aynı görünümde birden fazla div için kullanmak istersem ne olur? bu kod gerçek tüm div için sınıfı değiştir, sınıfı yalnızca seçili tıklanan öğeye nasıl uygulayabilirim
xzegga

Teşekkürler. Sınıfı değiştir düğmesi tıklandığında neler olduğunu tam olarak anlamak için konsolu açın ve kodu görüntüleyin.
fidev

1
Bu SO başlığına da bir göz atın. Soru kapsamıyla% 100 bağlantılı olmayabilir, ancak yine de ekstra yararlı bilgiler sağlar: stackoverflow.com/questions/31047094/…
BiLaL

144

Koduma dinamik olarak " " sınıfı eklemek veya kaldırmak istiyorum , işte yaptığım şey.activeng-click

<ul ng-init="selectedTab = 'users'">
   <li ng-class="{'active':selectedTab === 'users'}" ng-click="selectedTab = 'users'"><a href="#users" >Users</a></li>
   <li ng-class="{'active':selectedTab === 'items'}" ng-click="selectedTab = 'items'"><a href="#items" >Items</a></li>
</ul>

13
Ng-init için -1. AngularJS belgelerine göre -The only appropriate use of ngInit is for aliasing special properties of ngRepeat, as seen in the demo below. Besides this case, you should use controllers rather than ngInit to initialize values on a scope.
Mike Grabowski

2
"Burada" denetleyici kısmından kaçınıyorum, çünkü bu sadece bunun nasıl yapılacağına dair temel işlevselliği göstermek için ...
cutedevil086

1
Ayrıca `` ng-class = "{'active': true} [selectedTab === 'users']"
Cody

Bunun neden işe yaradığını anlamıyorum. Angular 1.3.8'de çok benzer bir şey yapıyorum ve koşullu sınıf bir öğeye tıklandığında bir öğeden kaldırılmıyor. Diğer öğelerin yeniden oluşturulmadığını varsayıyorum. O halde bu neden hiç işe yaradı? Tek bir öğe tıklandığında Angular'ın eski sürümleri tüm listeyi yeniden mi oluşturdu?
Matt Molnar

Bunu ekliyorum çünkü sıradaki başka birine yardımcı olabilir. angular-ui-router, belirttiğiniz işlevselliğe ve çok daha fazlasına sahiptir. Bir uri ile temsil edilen durumlar yaratırsınız. Her durum, 1 veya daha fazla denetleyiciye, 1 veya daha fazla şablona ve bunlara bağlı 1 veya daha fazla görünüme sahip olabilir. Bağlantılar ui-sref yönergesi kullanılarak oluşturulur. Ui-sref-active yönergesi, durum etkin olduğunda belirli bir sınıfı o elemana bağlar. Angular UI-Router Belgeleri
deadbabykitten

12

Bunu sadece direktiflerle yapmanın basit ve temiz bir yolu var.

<div ng-class="{'class-name': clicked}" ng-click="clicked = !clicked"></div>

8

önceki sınıfı kaldırmak ve yeni bir sınıf eklemek istiyorsanız, bunu bir yönergede de yapabilirsiniz.

    .directive('toggleClass', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind('click', function() {
                if(element.attr("class") == "glyphicon glyphicon-pencil") {
                    element.removeClass("glyphicon glyphicon-pencil");
                    element.addClass(attrs.toggleClass);
                } else {
                    element.removeClass("glyphicon glyphicon-ok");
                    element.addClass("glyphicon glyphicon-pencil");
                }
            });
        }
    };
});

ve şablonunuzda:

<i class="glyphicon glyphicon-pencil" toggle-class="glyphicon glyphicon-ok"></i>

neden etiket ve yönergedeki simgelerin adlarına sahipsiniz?
Robert Johnstone

Bu aptalca bir yorum. Angular'da bir şeyin nasıl yapılacağını açıklarken belki de bunun yeri olmadığına katılıyorum
bert

neden sadece: angular.element ('glyphicon glyphicon-kalem) .removeClass (' glyphicon glyphicon-kalem ') yapmayasınız? angular.element, jquery'deki $ 'ın oldukça fazla jqLite sürümüdür. Bu işlevi çağıran bir hizmet veya yönerge oluşturabilir ve yapıcıda removeClasses ve addedClasses iletilebilir
MattE

Bu doğru, ancak düz açısal js kullanmaya çalışıyordum.
Shilan

7

Tamamen haklısınız, yapmanız gereken tek şey, ng-tıklamanızda selectedIndex'i ayarlamaktır.

ng-click="selectedIndex = 1"

Burada ng görünümünü değiştiren ve o anda seçili olan görünümün düğmesini vurgulayan bir dizi düğmeyi nasıl uyguladım.

<div id="sidebar" ng-init="partial = 'main'">
    <div class="routeBtn" ng-class="{selected:partial=='main'}" ng-click="router('main')"><span>Main</span></div>
    <div class="routeBtn" ng-class="{selected:partial=='view1'}" ng-click="router('view1')"><span>Resume</span></div>
    <div class="routeBtn" ng-class="{selected:partial=='view2'}" ng-click="router('view2')"><span>Code</span></div>
    <div class="routeBtn" ng-class="{selected:partial=='view3'}" ng-click="router('view3')"><span>Game</span></div>
  </div>

ve bu benim kontrolörümde.

$scope.router = function(endpoint) {
    $location.path("/" + ($scope.partial = endpoint));
};

4

var app = angular.module("MyApp", []);
app.controller("subNavController", function ($scope){

        $scope.toggle = function (){
            $scope.isVisible = ! $scope.isVisible;
        };

        $scope.isVisible = false;
    });
<div ng-show="isVisible" ng-class="{'active':isVisible}" class="block"></div>


2

Bunu elde etmek için yukarıdaki Zack Argyle'ın önerisini kullandım, ki bunu çok zarif buldum:

CSS:

.active {
    background-position: 0 -46px !important;
}

HTML:

<button ng-click="satisfaction = 'VeryHappy'" ng-class="{active:satisfaction == 'VeryHappy'}">
    <img src="images/VeryHappy.png" style="height:24px;" />
</button>
<button ng-click="satisfaction = 'Happy'" ng-class="{active:satisfaction == 'Happy'}">
    <img src="images/Happy.png" style="height:24px;" />
</button>
<button ng-click="satisfaction = 'Indifferent'" ng-class="{active:satisfaction == 'Indifferent'}">
    <img src="images/Indifferent.png" style="height:24px;" />
</button>
<button ng-click="satisfaction = 'Unhappy'" ng-class="{active:satisfaction == 'Unhappy'}">
    <img src="images/Unhappy.png" style="height:24px;" />
</button>
<button ng-click="satisfaction = 'VeryUnhappy'" ng-class="{active:satisfaction == 'VeryUnhappy'}">
    <img src="images/VeryUnhappy.png" style="height:24px;" />
</button>

2

Denetleyicide sınıf ekleme ve çıkarma mantığının gerçekleşeceği şekilde endişelerin ayrılmasını tercih ederseniz, bunu yapabilirsiniz.

kontrolör

 (function() {
    angular.module('MyApp', []).controller('MyController', MyController);

    function MyController() {
      var vm = this;
      vm.tab = 0;

      vm.setTab = function(val) {
          vm.tab = val;
       };
      vm.toggleClass = function(val) {
          return val === vm.tab;
           };
        }
    })();

HTML

<div ng-app="MyApp">
  <ul class="" ng-controller="MyController as myCtrl">
    <li ng-click="myCtrl.setTab(0)" ng-class="{'highlighted':myCtrl.toggleClass(0)}">One</li>
    <li ng-click="myCtrl.setTab(1)" ng-class="{'highlighted':myCtrl.toggleClass(1)}">Two</li>
    <li ng-click="myCtrl.setTab(2)" ng-class="{'highlighted':myCtrl.toggleClass(2)}">Three</li>
   <li ng-click="myCtrl.setTab(3)" ng-class="{'highlighted':myCtrl.toggleClass(3)}">Four</li>
 </ul>

CSS

.highlighted {
   background-color: green;
   color: white;
}

-1

Herkesin bunu ne kadar karmaşık yaptığına inanamıyorum. Bu aslında çok basit. Bunu html'nize yapıştırmanız yeterlidir (yönerge./controller değişikliği gerekmez - "bg-info" bir önyükleme sınıfıdır):

<div class="form-group col-md-12">
    <div ng-class="{'bg-info':     (!transport_type)}"    ng-click="transport_type=false">CARS</div>
    <div ng-class="{'bg-info': transport_type=='TRAINS'}" ng-click="transport_type='TRAINS'">TRAINS</div>
    <div ng-class="{'bg-info': transport_type=='PLANES'}" ng-click="transport_type='PLANES'">PLANES</div>
</div>

-1

Reaktif formlar için -

HTML dosyası

<div class="col-sm-2">
  <button type="button"  [class]= "btn_class"  id="b1" (click)="changeMe()">{{ btn_label }}</button>
</div>

TS dosyası

changeMe() {
  switch (this.btn_label) {
    case 'Yes ': this.btn_label = 'Custom' ;
    this.btn_class = 'btn btn-danger btn-lg btn-block';
    break;
    case 'Custom': this.btn_label = ' No ' ;
    this.btn_class = 'btn btn-success btn-lg btn-block';
    break;
    case ' No ': this.btn_label = 'Yes ';
      this.btn_class = 'btn btn-primary btn-lg btn-block';
      break;
  }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.