Angualr.js의 ngClass는 Angular로 HTML 요소에 CSS 클래스를 동적으로 줄 수 있는 디렉티브다. HTML에서 클래스를 바꿔주는 건 자주 있는 일이지만 왠지 ngClass
의 문법은 잘 안 외워져서 쓸 때마다 헷갈린다.(문서가 좀 별로라)
ngClass
<p ng-class="{strike: deleted, bold: important, red: error}">Example</p>
기본적인 문법은 다음과 같다. ngClass에 객체를 전달하고 키가 class 명이고 값 부분이 class를 사용하지 말지에 대한 표현식이다. 그래서 위 코드는 deleted
, important
, error
라는 변수가 true
이면 각각에 해당하는 strike
, bold
, red
라는 CSS가 추가된다. 표현식을 쓸 수 있으므로 위처럼 변수 대신 다음과 같이 사용할 수도 있다. 우측이 true
/false
로만 떨어지면 된다.
ng-class="{selected: $index === 1}"
Angular 표현식으로 사용하면 다양한 상황에 제어할 수 있지만, 다음과 값에 따라 class를 다르게 줘야 한다면 꽤 복잡해진다.
ng-class="{food: type == 'food', place: type == 'place', people: type == 'people'}"
이런 경우에는 다음과 같이 간단하게 적을 수 있다.
ng-class="type"
다음과 같이 배열로 전달해서 여러 클래스를 한꺼번에 적용할 수도 있다. 이렇게 작성하면 type
변수에 할당된 문자열이 class 명으로 적용된다.
ng-class="[type1, type2, type3]"
좀 더 세밀하게 제어하고 싶다면 클래스 명을 반환하는 함수를 작성하면 된다.
<p ng-class="customClass('type2')">Map Syntax Example </p>
app.controller('MainController', function($scope) {
$scope.customClass = function (name) {
var className = '';
if (name === 'type1') {
className = 'custom1';
} else if (name === 'type2') {
className = 'custom2';
} else if (name === 'type3') {
className = 'custom3';
}
return className;
};
});
사실 이런 정도의 커스텀은 함수를 쓸 필요도 없이 다음과 같은 문법으로도 사용할 수 있다.
<p ng-class="{type1: 'custom1', type2: 'custom2', type3: 'custom3'}[type]">Map Syntax Example </p>
마지막에 대괄호로 묶어준 변수의 값과 일치하는 키에 해당하는 값이 클래스명으로 추가된다.(원래 이 문법이 어려워서 글을 쓰기 시작한건데 테스트가 잘 안되서 내용에서 뺐다가 댓글에서 Sangmin Yoon님의 글을 보고 무슨 실수를 했는지 깨달았다 ㅡㅡ;;)
이런 문법도 있더라고요.
ng-class="{true: 'btn-primary', false: 'btn-default'}[is_primary]"
검색으로 알게 되어 쓰고는 있는데, 문서 어디에 있는 내용인지는 모르겠습니다.
아~ 감사합니다. 사실 저도 그 문법을 썼었는데 글쓰면서 테스트하는데 잘 안되서 뺐었거든요... 주신 문법을 보고 뭘 착각했는지 깨달았네요. ㅎㅎ
관리자만 볼 수 있는 댓글입니다.
ngClass로 버튼을 생성하는게 어떤식으로 하셨는지 모르겠지만 맨위의 예시 코드처럼 여러 class를 추가할 수도 있으니 다른 색을 넣는 class를 지정하는 변수를 따로 만들면 될것 같은데요.
두번째 소스에 ng-clsas 라는 오타가 있습니다.