AngularJS에서 속성을 조건부로 적용하는 가장 좋은 방법은 무엇입니까?


296

범위의 부울 변수를 기반으로 요소에 예를 들어 "contenteditable"을 추가 할 수 있어야합니다.

사용 예 :

<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>

$scope.editMode로 설정된 경우 contenteditable = true가 요소에 추가 됩니다 true. 이 ng-class와 같은 속성 동작을 구현하는 쉬운 방법이 있습니까? 지침을 작성하고 공유하지 않을 경우 공유하는 것을 고려하고 있습니다.

편집 : 제안 된 attrs 지시문과 ng-bind-attrs 사이에 약간의 유사성이있는 것으로 보이지만 1.0.0.rc3 에서 제거 된 이유는 무엇입니까?


2
나는 그런 것을 보지 못했습니다. 투표 해주세요! : D 어쩌면 각도 프로젝트에 제출하십시오. ng-class와 더 잘 맞는 구문이 좋습니다. ng-attr="expression".
Xesued

나는 확실히 그 예를 고려하고 있습니다!
Kenneth Lynne

3
ngClass 또는 ngStyle과 동일하지 않습니다. 단일 속성을 제어하고 모든 속성 을 제어하려는 것이기 때문 입니다. contentEditable지시문 을 만드는 것이 더 좋을 것이라고 생각합니다 .
Josh David Miller

@JoshDavidMiller +1입니다. 특히 복잡성을 고려하여 모든 속성을 제어 할 수 있으면 약간의 이점이 있다고 생각합니다. 조건부로 변수에 작용하는 지시문을 가질 수 있습니다.
Umur Kontacı

<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
mia

답변:


272

ng-class를 사용할 수없는 경우 (예 : SVG 스타일링) 클래스 attr을 조건부로 설정하려면 다음을 사용하고 있습니다.

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

다른 속성 유형에도 동일한 접근 방식이 적용됩니다.

(ng-attr-를 사용하려면 최신 불안정한 각도에 있어야한다고 생각합니다. 현재 1.1.4입니다.)


97
그냥이 답변을 명확히 : 당신이 앞에 있다면 어떤 와 속성을 ng-attr-다음 컴파일러가 접두사를 제거 것, 그와 속성을 추가 할 의 결과에 바인딩 각도 표현 원래 속성 값에서.
Matthias

12
제 생각에 1.1.5에서 지원이 추가 된 삼항 연산자를 사용하면 읽기가 더 쉽습니다. {{someConditionalExpression? 'class-when-true': 'class-when-false'}}
dshap

129
이 방법의 문제점은 결과에 관계없이 속성이 작성된다는 것입니다. 이상적으로는 속성이 전혀 생성되지 않도록 제어하고 싶습니다.
airtonix

24
ng-attrstuff는 Angular 1.2에서 제거되었습니다. 이 답변은 더 이상 유효하지 않습니다.
유다 가브리엘 히 망고

2
당신은 잘못. 이 프로젝트 github.com/codecapers/AngularJS-FlowChart 는 Angular 1.2 및 ng-attr-를 사용합니다. 또한 최신 문서 (Angular 1.4)에는 여전히 ng-attr-
Ashley Davis

120

ng-attrAngular 표현식을 평가하기 위해 속성을 접두어로 사용할 수 있습니다 . 표현식의 결과가 정의되지 않으면 속성에서 값이 제거됩니다.

<a ng-attr-href="{{value || undefined}}">Hello World</a>

생산할 것 (가치가 거짓 인 경우)

<a ng-attr-href="{{value || undefined}}" href>Hello World</a>

따라서 false"false"라는 단어가 값으로 생성되므로 사용하지 마십시오 .

<a ng-attr-href="{{value || false}}" href="false">Hello World</a>

지시문에서이 트릭을 사용할 때. 지시문의 속성에 값이 없으면 false입니다.

예를 들어 위의 내용은 거짓입니다.

function post($scope, $el, $attr) {
      var url = $attr['href'] || false;
      alert(url === false);
}

3
나는이 답변을 좋아한다. 그러나 값이 정의되어 있지 않으면 속성을 숨길 것이라고 생각하지 않습니다. 그래도 뭔가 빠졌을 수도 있습니다. 따라서 첫 번째 결과는 <a ng-attr-href="{{value || undefined}}"" href> Hello World </a>입니다.
Roman K

13
@RomanK 안녕하세요, 설명서 undefined는 특별한 경우입니다. "ngAttr을 사용할 때 $ interpolate의 allOrNothing 플래그가 사용되므로 보간 된 문자열의 표현식이 정의되지 않은 경우 속성이 제거되고 요소에 추가되지 않습니다."
Reactgular

9
미래 독자들을 돕기 위해 '정의되지 않은'행동이 Angular 1.3에 추가 된 것으로 보입니다. 1.2.27을 사용하고 있으며 현재 IE8이 있어야합니다.
Adam Marshall

3
값이 정의되지 않은 경우에도 Angular 1.2.15가 href를 표시하면 위의 주석 상태와 같이 Angular 1.3에서 정의되지 않은 동작이 시작되는 것처럼 보입니다.
Brian Ogden

이 노트에 중요 ng-attr-foo것이다 여전히 항상 인보 foo존재하는 경우 지침, 심지어는 ng-attr-foo평가 undefined. 토론
hughes

97

속성을 열심히 설정 하여이 작업을 수행했습니다. 속성의 부울 값을 사용하여 속성 적용 가능성을 제어합니다.

다음은 코드 스 니펫입니다.

<div contenteditable="{{ condition ? 'true' : 'false'}}"></div>

이게 도움이 되길 바란다.


angular는 IIF 표현식을 구문 분석 할 수 있으므로 현재 범위의 상태를 평가하고 해당 상태를 기반으로 값을 지원하는 데 완벽하게 작동합니다.
mccainz

22

최신 버전의 Angular (1.1.5)에는이라는 조건부 지시문이 포함되어 있습니다 ngIf. 요소가 숨겨져 있지 않지만 DOM에 전혀 포함되지 않는다는 점 ngShow과 다릅니다 ngHide. 비용이 많이 들지만 사용되지 않는 구성 요소에 매우 유용합니다.

<h1 ng-if="editMode" contenteditable=true>{{content.title}}</h1>

32
ng-if가 요소 수준에서만 작동한다고 생각합니다. 즉, 요소의 한 속성에만 조건을 지정할 수 없습니다.
Max Strater

3
실제로, 그러나 당신은 할 수 있습니다<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ByScripts

5
그러나 ng-if새로운 범위 를 만드는 것을주의하십시오 .
Shimon Rachlenko

1
@ShimonRachlenko 동의합니다! 이것은 혼란과 버그의 큰 원천이 될 수 있습니다. ng-if새로운 범위를 만들지 만 ng-show그렇지 않습니다. 이 불일치는 항상 아픈 곳이었습니다. 이에 대한 방어적인 프로그래밍 반응은 "언제나 표현에 점이있는 무언가에 묶이는 것"이며 문제가되지 않습니다.
Brian Genisio

실제로 지시문 인 속성을 추가하려는 경우 효과적입니다. 코드 중복에 대한 부끄러움
Adam Marshall

16

부울 검사를 기반으로 특정 값을 표시하도록 속성을 가져 오거나 부울 검사가 실패한 경우 완전히 생략하려면 다음을 사용했습니다.

ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"

사용법 예 :

<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">

겠습니까 출력 <div class="itWasTest">또는 <div>값에 따라params.type


9

<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>

isTrue = true 일 때 생성됩니다. <h1 contenteditable="true">{{content.title}}</h1>

isTrue = false 일 때 : <h1>{{content.title}}</h1>


5
내가이 <H1의 contentEditable = "행">과 같은 몇 가지 일을하려는 경우
SuperUberDuper

<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
PhatBuck

이것은 내가 받아 들여야 할 대답이어야합니다. 내 시나리오는<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
LucasM

6

허용 된 솔루션 인 Ashley Davis가 게시 한 솔루션에 대해 설명 된 방법은 할당 된 값이 정의되지 않았다는 사실에 관계없이 DOM에 속성을 인쇄합니다.

예를 들어, ng-model과 value 속성이 모두있는 입력 필드 설정에서 :

<input type="text" name="myInput" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />

myValue의 배후에 관계없이 value 속성은 여전히 ​​DOM에 인쇄되어 해석됩니다. 그러면 Ng 모델이 재정의됩니다.

약간 불쾌하지만 ng-if를 사용하면 트릭이 수행됩니다.

<input type="text" name="myInput" data-ng-if="value" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />
<input type="text" name="myInput" data-ng-if="!value" data-ng-model="myModel" />

ng-if 지시문 내에서 더 자세한 검사를 사용하는 것이 좋습니다. :)


이 방법을 사용하면 동일한 코드를 반복하게됩니다.
Kalyan

사실이지만 모델 선언을 안전하게 유지합니다. 수용 된 솔루션을 사용할 때의 문제는 모델에서 우선하는 value 속성이 DOM에서 끝났다는 것입니다. 따라서 value 속성이 비어 있지만 모델이 아닌 경우 빈 값을 사용하도록 모델이 재정의됩니다.
alexc

6

또한 다음과 같은 표현식을 사용할 수 있습니다.

<h1 ng-attr-contenteditable="{{ editMode ? true : false }}"></h1>

5

나는 실제로 몇 달 전에이 작업을 수행하기 위해 패치를 작성했습니다 (누군가가 freenode의 #angularjs에서 요청한 후).

아마도 병합되지는 않지만 ngClass와 매우 유사합니다 : https://github.com/angular/angular.js/pull/4269

병합 여부에 관계없이 기존 ng-attr- * 항목은 사용자가 제안하는 더 많은 ngClass 스타일 기능보다 약간 복잡하지만 (다른 사람들이 언급했듯이) 아마도 귀하의 요구에 적합 할 것입니다.


2

입력 필드 유효성 검사를 위해 다음을 수행 할 수 있습니다.

<input ng-model="discount" type="number" ng-attr-max="{{discountType == '%' ? 100 : undefined}}">

이것은 다음과 같이 정의 된 경우에만 속성 max을 적용합니다.100discountType%


1

편집 :이 답변은 Angular2 +와 관련이 있습니다! 죄송합니다. 태그가 누락되었습니다!

원래 답변 :

특정 입력 값이 설정된 경우에만 속성을 적용 (또는 설정)하려는 매우 간단한 경우에 관해서는

<my-element [conditionalAttr]="optionalValue || false">

다음과 같습니다.

<my-element [conditionalAttr]="optionalValue ? optionalValue : false">

(그렇지 않으면 optionalValue가 적용되고 그렇지 않으면 표현식이 false이고 속성이 적용되지 않습니다.)

예 : 색상을 적용했지만 임의의 스타일을 적용 한 경우가 있습니다 (@Input () 색상이 지정되지 않은 경우에도).

@Component({
  selector: "rb-icon",
  styleUrls: ["icon.component.scss"],
  template: "<span class="ic-{{icon}}" [style.color]="color==color" [ngStyle]="styleObj" ></span>",
})
export class IconComponent {
   @Input() icon: string;
   @Input() color: string;
   @Input() styles: string;

   private styleObj: object;
...
}

따라서 "style.color"는 색상 속성이있을 때만 설정되었습니다. 그렇지 않으면 "styles"문자열의 색상 속성을 사용할 수 있습니다.

물론 이것은 또한 달성 할 수 있습니다

[style.color]="color" 

@Input color: (string | boolean) = false;

Angular.JS는 Angular 1이며 Angular 2+와는 매우 다릅니다. 귀하의 솔루션은 Angular 2 이상에 대한 답변이지만 AngularJS (1)이 요청되었습니다.
ssc-hrep3 2016 년

@ ssc-hrep3 : 당신이 맞아요. 미안해! 감사. 나는 그것을 지적하기 위해 답을 편집했다. :-)
Zaphoid 2016 년

각도가 아닌 각도, 각도는 각도 1
dgzornoza

0

Angular 2에 대한 솔루션이 필요한 경우 다음과 같은 간단한 속성 바인딩을 사용하십시오.

<input [readonly]="mode=='VIEW'"> 

각도 (angular2)가 아닌 angularjs (angular1)입니다.
dgzornoza

앵귤러 2+와 앵귤러 JS는 동일하지 않으며, 서로 다른 제품과 비슷합니다.
Sanjay Singh

0

이 작업을 수행 할 수있었습니다.

ng-attr-aria-current="{{::item.isSelected==true ? 'page' : undefined}}"

여기서 좋은 점은 item.isSelected가 false이면 속성이 단순히 렌더링되지 않는다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.