Angular 2에서 조건부 속성을 추가하는 방법은 무엇입니까?


276

checked확인란 의 요소 속성을 조건부로 추가 하려면 어떻게해야합니까?

Angular의 이전 버전은 NgAttr내가 가지고 NgChecked있던 기능을 제공하는 것 같습니다. 그러나 이러한 특성은 Angular 2에 존재하지 않는 것으로 보이며이 기능을 제공하는 다른 방법은 없습니다.




2
Google 직원, 각도 구성 요소에
무가치

답변:


574

null 그것을 제거합니다 :

[attr.checked]="value ? '' : null"

또는

[attr.checked]="value ? 'checked' : null"

힌트:

속성 대 속성

이 바인딩을 추가 HTML 요소가 (바인딩에 사용되는 이름을 가진 속성이없는 경우 checked을 가지고 같은 요소에 적용되고이 경우에)없고 각도 구성 요소 또는 지시를 @Input() checked;한 후 [xxx]="..."사용할 수 없습니다.

참조 HTML의 속성과 특성의 차이점은 무엇입니까?

그러한 속성이 없을 때 바인딩 할 내용

대안은 [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."당신이 달성하려고 무엇에 따라 달라집니다.

때문에 <input>단지는이 checked속성이 있지만 checked속성 [attr.checked]="..."이 특정 사건에 대한 올바른 방법입니다.

속성은 문자열 값만 처리 할 수 ​​있습니다

일반적인 함정은 [attr.xxx]="..."바인딩을 위해 값 ( ...)이 항상 문자열 화 된다는 것입니다 . 속성과 @Input()s 만 부울, 숫자, 객체 등과 같은 다른 값 유형을 수신 할 수 있습니다.

요소의 대부분의 속성과 속성은 연결되어 있으며 이름이 같습니다.

속성 속성 연결

속성에 바인딩되면 속성은 속성에서 문자열 값만받습니다.
속성에 바인딩되면 속성에 바인딩 된 값 (부울, 숫자, 개체 등)과 문자열 값을 다시받습니다.

속성 및 속성 이름이 일치하지 않는 두 가지 경우

이후 Angular가 변경되어 이러한 특별한 경우를 알고 처리하여 <label [for]="그러한 속성이 존재하지 않아도 바인딩 할 수 있습니다 (와 동일 colspan)


3
"attr"을 생략 할 수 있습니다. 접두사.
Filip Stachowiak

16
@FilipStachowiak는 속성이되지 않습니다. 많은 요소에는 요소 자체가 속성에 바인딩 된 값을 속성 (및 다른 방향)에 반영하는 다양한 속성이 있습니다. 이 경우에는 필요하지 않습니다 attr.. 그러나 사용자 정의 속성을 추가하려면 attr.접두사 가 필요합니다.
Günter Zöchbauer

14
분명히하기 위해, 당신 은 이것 의 일부가 필요 합니다 attr.. 설정하려고 [href]했지만 항목의 href속성이 존재 하는 경우에만 설정 하기를 원했습니다 . [attr.href]이것이 없으면 값이 'null'인 href를 추가하여 클릭하면 현재 페이지를 새로 고칩니다. [attr.href]고쳤다.
dudewad

나에게 들리지 않는 @dudewad. 속성 href이있는 요소 를 설정하면 href을 사용할 필요가 없습니다 attr. 다른 문제가 있어야합니다.
Günter Zöchbauer 2016 년

@ günter-zöchbauer 글쎄, Ng 4.x를 사용하고 <a [href]="item.href">있으며 item.href정의되지 않은 곳 (값이 정의되지 않았지만 속성 href이 존재하지 않음 item)이 href속성을 설정 했습니다 null. 나는 솔직히이 시점에서 많은 관심을 기울이지 않기 때문에 소스를 조사하지 않았지만 (이것은 작은 세부 사항이지만) attr.완전히 다른 지시문이므로 다른 행동은 나에게 놀라운 일이 아닙니다.
dudewad

37

각도 2 속성 구문에서

<div [attr.role]="myAriaRole">

속성 역할을 myAriaRole 표현식의 결과에 바인딩합니다.

그래서처럼 사용할 수 있습니다

[attr.role]="myAriaRole ? true: null"

9
여기서 문제는 때이다 your expressionfalse은 DOM의 속성과 같이 표시됩니다 <div checked="false">. 이것이 의도 된 효과라고 생각하지 않습니다.
Günter Zöchbauer

7
감사하지만 조건부로 값을 할당하지 않고 속성을 조건부로 추가하는 방법을 물었습니다.
Jonathan Miles

"attr"을 생략 할 수도 있습니다. 접두사.
Filip Stachowiak

1
@FilipStachowiak는 속성이되지 않습니다. 많은 요소에는 요소 자체가 속성에 바인딩 된 값을 속성 (및 다른 방향)에 반영하는 다양한 속성이 있습니다. 이 경우에는 필요하지 않습니다 attr.. 그러나 사용자 정의 속성을 추가하려면 attr.접두사 가 필요합니다.
Günter Zöchbauer

오 남자, 이것 : null은 놀랍습니다, 이것이 조건부로 사용될 수 있다는 것을 알고 있습니다! 솔루션 주셔서 감사합니다.
pinarella

17

Günter Zöchbauer 정유

이것은 지금 다른 것처럼 보입니다. 앵커 태그에 href 속성을 조건부로 적용하기 위해이 작업을 수행하려고했습니다. '적용 안 함'사례에 대해서는 undefined를 사용해야합니다. 예를 들어, 조건부로 href 속성이 적용된 링크로 시연하겠습니다.

href 속성이없는 앵커 태그는 일반 텍스트가되어 하이퍼 링크 spec에 따라 링크의 자리 표시자를 나타냅니다 .

내 탐색에는 링크 목록이 있지만 해당 링크 중 하나가 현재 페이지를 나타냅니다. 현재 페이지 링크를 링크로 사용하고 싶지는 않지만 여전히 목록에 표시되기를 원합니다 (일부 사용자 정의 스타일이 있지만이 예제는 단순화되었습니다).

<a [attr.href]="currentUrl !== link.url ? link.url : undefined">

span과 anchor 태그에 두 개의 * ngIf를 사용하는 것보다 깨끗합니다.


5

입력 요소 인 경우 다음과 같이 작성할 수 있습니다 .. <input type="radio" [checked]="condition">condition 값은 true 또는 false 여야합니다.

스타일 속성에 대해서도 ... <h4 [style.color]="'red'">Some text</h4>


4

이것을 사용할 수 있습니다.

<span [attr.checked]="val? true : false"> </span>


'val'을 사용하여 속성 값을 확인했습니다. 그것이 참이면 단순히 참은 그렇지 않으면 거짓을 돌려 준다
WapShivam

1

기존 scss의 HTML을 작성하는 사람에게 더 나은 접근 방식을 사용할 수 있습니다.
html

[attr.role]="<boolean>"

scss

[role = "true"] { ... }

그렇게하면 <boolean> ? true : null매번 필요하지 않습니다 .


모든 경우에 작동하지는 않습니다. 예를 들어 요소의 multiple속성으로 작동하지 않습니다 select.
smartmouse


0

아래 코드에서 추가 된 특정 필드에 대해서만 툴팁을 원했지만 다중에 툴팁을 원하면 다음을 사용하여 배열 valdidate를 가질 수 있습니다.

사용자 정의 데이터 툴팁 속성이있는 여러 요소 :

1 : [ 'key1ToHaveTooltip',`key2ToHaveTooltip ']. includes (key)

2 : [ 'key1ToHaveTooltip', 'key2ToHaveTooltip']. indexOf (key)> -1

둘 이상의 요소에 툴팁 속성이 있어야합니다.

   <div *ngFor="let key of Keys"
             [attr.data-tooltip]="key === 'IwantOnlyThisKeyToHaveTooltipAttribute' 
                                           ? 'Hey! I am a tooltip on key matched'
                                           : null">
   </div>

-7

인라인 맵도 편리합니다.

그들은 조금 더 명확하고 읽기 쉽습니다.

[class]="{ 'true': 'active', 'false': 'inactive', 'true&false': 'some-other-class' }[ trinaryBoolean ]"

삼항 구문이나 ngIfs 등 을 좋아하지 않는 경우 동일한 일을 수행하는 또 다른 방법 .


1
클래스는 속성과는 완전히 다른 것입니다 (질문과 관련)
Günter Zöchbauer

1
귀하는 또한 질문에 대한 적절한 답변을 얻기 위해 노력할 수 있습니다. 그런 다음 투표를 재검토 할 이유가있었습니다. 또한 의견을 추가하지 않고도 공감대가 무엇인지에 대한 의견을 밝히지 않을 수 있습니다.
Günter Zöchbauer

1
@Cody 메소드가 checked속성 과 함께 작동하는 방법 (입력 태그에서 추가 / 제거 )을 설명 (예제 코드 제공) 할 수 <input type="checkbox" name="vehicle" value="Car" checked>있습니까? ( 귀하의 코드에서 변경 class하면 checkbox작동하지 않습니다. (이것을 확인하십시오))
Kamil Kiełczewski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.