ng-class를 사용하는 AngularJS 토글 클래스


217

사용하여 요소의 클래스를 전환하려고합니다. ng-class

<button class="btn">
  <i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>

isAutoScroll () :

$scope.isAutoScroll = function()
{
    $scope.autoScroll = ($scope.autoScroll) ? false : true;
    return $scope.autoScroll;
}

기본적으로, $scope.autoScroll사실이라면 ng-class가 icon-autoscroll되고 싶고 거짓이면 내가되고 싶습니다.icon-autoscroll-disabled

내가 지금 작동하지 않고 콘솔 에서이 오류가 발생합니다.

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

이 작업을 올바르게 수행하려면 어떻게합니까?

편집하다

해결책 1 : (구식)

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>

편집 2

해결책 2 :

Solution 3Stewie에서 제공 하는 솔루션을 사용해야합니다. 삼항 연산자와 관련하여 가장 읽기 쉬운 표준입니다. 해결책은

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>

다음과 같이 번역됩니다.

if (autoScroll == true) ?// 클래스 사용 'icon-autoscroll' :// 다른 용도'icon-autoscroll-disabled'


angular expressions문서별로 조건을 사용할 수 없음 => 제어 흐름 문 없음 : 각도 표현에서 조건부, 루프 또는 throw 중 하나를 수행 할 수 없습니다. 다른 함수 또는 지시어 사용
charlietfl

@Ronnie 나는 당신의 해결책을 보았습니다. 그러나 왜 autoScroll여기에 각 버튼에 영향을 미치는지 궁금 합니다. (여러 버튼으로 이것을 테스트했으며 잘 작동합니다.) 각 버튼을 클릭하면 모든 버튼 대신 해당 버튼에만 영향을 미칩니다.
zx1986

답변:


436

ng-class에서 조건부를 사용하는 방법 :

해결책 1 :

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

해결책 2 :

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

솔루션 3 (각도 v.1.1.4 +는 삼항 연산자에 대한 지원을 도입했습니다) :

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

플 런커


3
두 번째 예는 더 깔끔하지만 평가하는 변수를 표현식 앞에 놓을 수 없다는 것은 우스운 일입니다. "if (variable) true : do this, false : do ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakin 화려한 동료가 실제 코드가 아닌 일부 놨 표현 마크 업처럼 보이는 방법, 사랑 : D
mattdlockyer

실제로 값을 먼저 평가하는 것은 실수로 변수에 새로운 값을 할당하지 않기 때문에 매우 유용합니다.
lharby

Ternary는 내가 찾던 것입니다. 버전 지원 세부 정보가 포함 된 세 가지 예를 제공하는 것이 좋습니다.
TaeKwonJoe

13

마지막 평가를 반환하는 자바 스크립트 논리 연산자 '&&'를 기반으로하는 대체 솔루션으로 다음과 같이 수행 할 수도 있습니다.

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

구문이 약간 짧지 만 읽기 쉽습니다.


10

조건에 따라 둘 이상의 클래스를 추가하십시오.

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

적용 : class1 + class2 + class3 isNew = false

적용 : isNew = true 인 경우 class1 + class4


6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

jQuery의 toggleClass메소드 와 유사하게 active요소를 클릭 할 때 클래스를 켜거나 끄는 방법 입니다.


2
영어로 된 답변에 대한 추가 정보를 제공해 주시겠습니까? 이미 존재하는 답변과 다른 점은 무엇입니까?
Onots

2
왜이 답변에 많은 부정 투표가 있는지 잘 모르겠습니다. 이것은 위의 다른 것보다 실제로 나를 위해 더 잘 작동 한 솔루션입니다.
Paulo Griiettner

2
설명이 잘못 작성되어 사람들이 "jQuery"라는 단어에 반응한다고 생각합니다. "JQuery의 toggleClass 함수와 유사합니다." BTW, 변수를 초기화해야합니까?
디자인 : Adrian

1

자동 스크롤은 컨트롤러에서 정의되고 수정됩니다.

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

조건에 따라 여러 클래스를 추가하십시오.

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>


-1

나는 이런 식 으로이 일을했다 :

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

// 컨트롤러에서

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
작동하지만 각도와 jQuery를 혼합하고 있습니다. 가능하면 시도하지 말아야합니다. 원래 요청 된 것은 클릭 이벤트없이 수행 될 수 있습니다. 위의 버튼에서이 클래스를 토글해야하는 다른 버튼이 있으면 어떻게합니까? ng-class가 아닌 클릭시 변경되므로 지금 업데이트되지 않습니다
Ronnie

1
jqLite에서 온 것입니다. 더 많은 docs.angularjs.org/api/ng/function/angular.element에 대해
Ruhul Amin

1
이해 했어요. 내 요점은 원래 질문에 대한 답변을 얻기 위해 jQuery를 사용할 필요가 없다는 것입니다.
Ronnie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.