Angular 2+에서 ngShow 및 ngHide와 동일한 기능은 무엇입니까?


답변:


950

그냥 hidden속성에 바인딩

[hidden]="!myVar"

또한보십시오

이슈

hiddendisplay속성에 대한 CSS와 충돌 할 수 있기 때문에 몇 가지 문제가 있습니다.

방법을 참조하십시오 some에서 Plunker 예 는 스타일을 가지고 있기 때문에 숨겨진되지 않습니다

:host {display: block;}

세트. (이것은 다른 브라우저에서 다르게 작동 할 수 있습니다-Chrome 50으로 테스트했습니다)

해결 방법

추가하여 문제를 해결할 수 있습니다

[hidden] { display: none !important;}

의 글로벌 스타일로 index.html.

또 다른 함정

hidden="false"
hidden="{{false}}"
hidden="{{isHidden}}" // isHidden = false;

~와 같다

hidden="true"

요소를 표시하지 않습니다.

hidden="false""false"진실로 간주 되는 문자열 을 할당합니다 .
값을 지정 false하거나 속성을 제거하면 실제로 요소가 표시됩니다.

를 사용 {{}}하면 표현식을 문자열로 변환하여 예상대로 작동하지 않습니다.

[]이 ( false가) false대신 할당 되었으므로와의 바인딩 만 예상대로 작동 "false"합니다.

*ngIf vs [hidden]

*ngIf속성 을 [hidden]수정하는 동안 DOM에서 내용을 효과적으로 제거하고 display브라우저에 내용을 표시하지 않지만 DOM에는 여전히 내용을 포함하도록 지시합니다.


21
실제로는 사용하지 않는 것이 좋습니다. angularjs.blogspot.com/2016/04/…
Sam

7
*ngIf대부분의 경우 올바른 방법 일 수 있지만 때로는 시각적으로 숨겨진 요소가 실제로 있기를 원할 수도 있습니다. [hidden]{display:none!important}도움이 되는 CSS 스타일 . 예를 들어, Bootstrap이 [hidden]요소를 실제로 숨기는 방법입니다. GitHub
CunningFatalist

당신이 (myStream | 비동기) 사용할 때 몇 가지 문제가 발생할 수 있습니다 * ngIf의 내부에 파이프를 그 또한 사용 (myStream | 비동기) 파이프
파벨 Blagodov

1
당신은 나의 구세주입니다! * ngIf를 사용하면 DOM 위치를 맨 위로 재설정하지만 [숨겨 짐]으로 내 문제를 해결하고 위치를 유지했습니다.
Santosh

1
* ngIf에 [hidden]을 사용하고 싶을 수있는 한 가지 사례는 HostListener를 사용할 때 (문서 클릭과 event.target을 구별하려는 경우), 사용자 정의 드롭 다운과 같은 요소를 표시하거나 숨기려고 할 때
akhouri

140

[hidden]속성을 사용하십시오 .

[hidden]="!myVar"

아니면 사용할 수 있습니다 *ngIf

*ngIf="myVar"

요소를 표시하거나 숨기는 두 가지 방법이 있습니다. 유일한 차이점은 *ngIfDOM에서 요소를 제거하는 반면 DOM [hidden]에 요소를 display유지 하여 CSS 속성을 사용하여 요소를 표시하거나 숨기도록 브라우저에 지시 하는 것 입니다.


3
[hidden]은 요소에 "hidden"속성을 조건부로 추가합니다. [무엇이든] 또는 [ali] 일 수도 있습니다. 여기서 "숨겨진"속성을 표시하는 CSS 규칙을로드하는 것이 중요합니다. 없음
Gabriel

5
명심하십시오 : * ngIf와 [숨겨진]은 기본적으로 다릅니다. ngIf는 조건이 true가 될 때까지 * ngIf 블록 내의 내용을 평가하지 않습니다. async파이프 를 사용하는 경우 관찰 조건에 대한 구독이 조건이 충족 된 후에 만 ​​추가 되므로 파이프 를 사용하는 경우 특히 중요 합니다!
Dynalon

2
한 가지 더 고려해야 할 사항은 * ngIf가 구성 요소를 파괴하고 다시 작성해야하는 반면 [숨겨진]은 구성 요소를 메모리에 유지한다는 것입니다. 리소스가 많은 구성 요소가 있다면 그것을 제거하는 대신 숨기는 것이 좋습니다
Michael Kork.

1
그들은 같은 것이 아닙니다.
Kamuran Sönecek

36

나는 내 경우와 다른 상황에서 같은 상황에 처한 것을 발견했다. 요소가 플렉스 컨테이너였다.

[style.display]="!isLoading ? 'block' : 'none'"

내 경우에는 우리가 지원하는 많은 브라우저가 여전히 문제를 피하기 위해 공급 업체 접두사가 필요하다는 사실 때문에 다른 쉬운 해결책을 찾았습니다.

[class.is-loading]="isLoading"

그러면 CSS는 다음과 같이 간단합니다.

&.is-loading { display: none } 

표시된 상태를 기본 클래스가 처리 한 상태로 둡니다.


1
이것은 부트 스트랩 4 invalid-feedback클래스 와 잘 작동합니다 .
Jess

25

죄송합니다, Angular 2를 사용할 때 안전하지 않은 것으로 간주되는 hidden에 바인딩하는 것에 동의하지 않아야합니다. 이는 숨겨진 스타일을 사용하여 예를 들어

display: flex;

권장되는 방법은 * ngIf를 사용하는 것이 더 안전합니다. 자세한 내용은 공식 Angular 블로그를 참조하십시오. Angular 2로 피해야 할 5 가지 신인 실수

<div *ngIf="showGreeting">
   Hello, there!
</div>

12
정확한 요구 사항을 알기 전에 뭔가 나쁜 점을 말하는 것은 신인 실수라고 생각합니다. 요소를 제거하고 파괴하고 추가하고 다시 만들지 않으려면 *ngIf좋지 않은 선택입니다. 그러나 결과를 고려해야하며 함정을 지적하는 것이 항상 좋은 생각입니다.
Günter Zöchbauer 5

2
무슨 뜻인지 알아 그것은 초보자 실수라는 내 말이 아니며 Angular 2 공식 블로그에서 가져온 것입니다. 나는 누군가를 화나게하는 것을 의미하지 않습니다. 지적 해 주셔서 감사합니다.
Tim Hong

9
그래, 나는 ngIf이 질문이 무엇을 요구하는지 정확하게 대답 하지 않는다 . 가 포함 된 페이지에서 일부 콘텐츠를 숨기고 싶습니다 <router-outlet>. 를 사용 ngIf하면 콘센트를 찾을 수 없다는 오류가 발생합니다. 내가 할 수있는 콘센트가 필요합니다 숨겨진 내 데이터로드,하지 때까지 결석 내 데이터를로드 할 때까지.
Jason Swett

나는 당신과 동의하지만, 내가 가지고있는 문제는 내가 그것을하고 잘 작동 숨겨진 속성이 정의되지 않는 오류를해야합니다 ngIf 나는 *를 사용하는 경우 형태와 그 안에 넣어 값을 표시 할 것입니다
하젬을 하산

@HazemHASAN입니다. 이해 했어요. 솔루션은 항상 조건부입니다. 귀하의 경우 다른 코드를 실행하기 전에 양식이 있는지 확인하는 것이 가능한지 확실하지 않습니다. 그것은 절충에 관한 것입니다. 나중에 실수로 다른 스타일에 의해 상쇄되지 않는 양식을 숨기는보다 안전한 방법을 원하십니까? 또는 양식이 있는지 확인하지 않는 것이 편리합니까?
Tim Hong

4

귀하의 경우 스타일이 표시되지 않는 경우 ngStyle 지시문을 사용하고 디스플레이를 직접 수정할 수도 있습니다. 부트 스트랩 DropDown의 UL은 없음을 표시하도록 설정되었습니다.

UL을 표시하도록 "수동으로"전환하는 클릭 이벤트를 만들었습니다.

<div class="dropdown">
    <button class="btn btn-default" (click)="manualtoggle()"  id="dropdownMenu1" >
    Seleccione una Ubicación
    <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" [ngStyle]="{display:displayddl}">
        <li *ngFor="let object of Array" (click)="selectLocation(location)">{{object.Value}}</li>                                
     </ul>
 </div>    

그런 다음 구성 요소에 매번 토글하는 showDropDown : bool 속성이 있으며 int를 기반으로 다음과 같이 스타일에 대해 displayDDL을 설정하십시오.

showDropDown:boolean;
displayddl:string;
manualtoggle(){
    this.showDropDown = !this.showDropDown;
    this.displayddl = this.showDropDown ? "inline" : "none";
}

4

ngShowngHide 의 Angular 1 문서에 따르면 ,이 지시어는 css 스타일 display: none !important;을 해당 지시어의 조건에 따라 요소에 추가합니다 (ngShow의 경우 css를 잘못된 값에 추가하고 ngHide의 경우 css를 true 값으로 추가).

Angular 2 지시문 ngClass를 사용하여이 동작을 수행 할 수 있습니다.

/* style.css */
.hide 
{
    display: none !important;
}

<!-- old angular1 ngShow -->
<div ng-show="ngShowVal"> I'm Angular1 ngShow... </div>

<!-- become new angular2 ngClass -->
<div [ngClass]="{ 'hide': !ngShowVal }"> I'm Angular2 ngShow... </div>

<!-- old angular2 ngHide -->
<div ng-hide="ngHideVal"> I'm Angular1 ngHide... </div>

<!-- become new angular2 ngClass -->
<div [ngClass]="{ 'hide': ngHideVal }"> I'm Angular2 ngHide... </div>

공지 사항에 대한 것을 showAngular2의 행동에 우리가 추가 할 필요가 !ngShowVal 전에 (안)을위한 hideAngular2의 행동을 우리가 하지 않는 추가 할 필요가 !ngHideVal 전에 (하지).


4
<div [hidden]="myExpression">

myExpression이 true 또는 false로 설정되었을 수 있습니다


2
<div hidden="{{ myExpression }}">"myExpression"이 문자열로 변환되어 html로 렌더링되므로 작동하지 않습니다. 그것은 항상 숨길 수 있도록 모두 "true"와 "false"문자열, truthy 있습니다
Viprus


3

부트 스트랩 4.0에서 클래스 "d-none"= "display : none! important;"

<div [ngClass]="{'d-none': exp}"> </div>

3

이 문제를 겪고있는 다른 사람들에게는 이것이 내가 달성 한 방법입니다.

import {Directive, ElementRef, Input, OnChanges, Renderer2} from "@angular/core";

@Directive({
  selector: '[hide]'
})
export class HideDirective implements OnChanges {
  @Input() hide: boolean;

  constructor(private renderer: Renderer2, private elRef: ElementRef) {}

  ngOnChanges() {
    if (this.hide) {
      this.renderer.setStyle(this.elRef.nativeElement, 'visibility', 'hidden');
    } else {
      this.renderer.setStyle(this.elRef.nativeElement, 'visibility', 'visible');
    }
  }
}

'visibility'요소가 차지하는 공간을 보존하고 싶었 기 때문에 사용했습니다 . 그렇게하고 싶지 않다면 그냥 사용 'display'하고 설정할 수 있습니다 'none'.

동적으로 HTML 요소에 바인딩 할 수 있습니다.

<span hide="true"></span>

또는

<span [hide]="anyBooleanExpression"></span>

2

컨트롤이 있는 모델 을 바인딩 하고 CSS 를 지정 하는 것처럼 숨김을 사용하십시오 .

HTML :

<input type="button" class="view form-control" value="View" [hidden]="true" />

CSS :

[hidden] {
   display: none;
}

2

이것이 나를 위해 일한 것입니다.

<div [style.visibility]="showThis ? 'visible' : 'hidden'">blah</div>


1

나를 위해, [hidden]=!var일한 적이 없다.

그래서, <div *ngIf="expression" style="display:none;">

그리고 <div *ngIf="expression">항상 올바른 결과를 제공하십시오.


0

Angular 문서에는 두 가지 예가 있습니다 https://angular.io/guide/structural-directives#why-remove-rather-than-hide

지시문은 표시 스타일을 none으로 설정하여 원하지 않는 단락을 숨길 수 있습니다.

<p [style.display]="'block'">
  Expression sets display to "block".
  This paragraph is visible.
</p>

<p [style.display]="'none'">
  Expression sets display to "none".
  This paragraph is hidden but still in the DOM.
</p>

[style.display] = " 'block'"을 사용하여 ngShow를 대체하고 [style.display] = " 'none'"을 사용하여 ngHide를 대체 할 수 있습니다.


0

이 문제를 해결하는 가장 좋은 방법은 ngIf 해당 요소가 프런트 엔드에서 렌더링되지 않도록하기 때문입니다.

[hidden]="true"숨기기 또는 스타일 숨기기 를 사용하면 [style.display]프런트 엔드의 요소 만 숨겨지고 누군가가 값을 변경하고 쉽게 볼 수 있습니다. 제 생각에 요소를 숨기는 가장 좋은 방법은ngIf

<div *ngIf="myVar">stuff</div>

또한 여러 요소가있는 경우 (다른 요소도 구현해야 함) <ng-template>옵션 을 사용할 수 있습니다

<ng-container *ngIf="myVar; then loadAdmin else loadMenu"></ng-container>
<ng-template #loadMenu>
     <div>loadMenu</div>
</ng-template>

<ng-template #loadAdmin>
     <div>loadAdmin</div>
</ng-template>  

ng-template 코드 샘플


0

AngularJS와 함께 제공된 대칭 hidden/ shown지시문을 사용하려면 템플릿을 단순화하기 위해 속성 지시문을 작성하는 것이 좋습니다 (Angular 7로 테스트).


import { Directive, Input, HostBinding } from '@angular/core';

@Directive({ selector: '[shown]' })
export class ShownDirective {
  @Input() public shown: boolean;

  @HostBinding('attr.hidden')
  public get attrHidden(): string | null {
    return this.shown ? null : 'hidden';
  }
}

다른 많은 솔루션이 맞습니다. 당신은 해야 사용할 *ngIf경우 이제까지 가능. 이 hidden속성을 사용하면 예기치 않은 스타일이 적용될 있지만 다른 구성 요소를 작성하지 않는 한 해당 속성 인지 알고있을 것입니다. 따라서이 shown지시문이 작동하려면 다음을 추가해야합니다.

[hidden]: {
  display: none !important;
}

당신의 글로벌 스타일 어딘가에.

이것들로 당신은 지시어를 다음과 같이 사용할 수 있습니다 :

<div [shown]="myVar">stuff</div>

대칭 (및 반대) 버전으로 다음과 같이하십시오.

<div [hidden]="myVar">stuff</div>

받는 사람에 추가하려면 shoulds - 통 더 정상적으로 또한 우리과 같이 접두사 [acmeShown]만 대 [shown].

shown숨겨진 속성에 XHR 왕복을 발생시키는 컨테이너 구성 요소가 포함 된 경우 속성 지시문을 사용한 주된 이유 는 AngularJS 코드를 Angular로 변환하기위한 것입니다. 내가 사용하지 않는 이유 [hidden]="!myVar"는 종종 다음과 같이 더 복잡하기 때문입니다. [hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.[표시된]`은 생각하기가 더 쉽습니다.


-1

버튼에 div를 숨기고 표시하려면 각도 6을 클릭하십시오.

HTML 코드

<button (click)=" isShow=!isShow">FormatCell</button>
<div class="ruleOptionsPanel" *ngIf=" isShow">
<table>
<tr>
<td>Name</td>
<td>Ram</td>
</tr>
</table>
</div>

구성 요소 .ts 코드

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent{
 isShow=false;
  }

이것은 나를 위해 작동하며 angular6에서 ng-hide 및 ng-show를 바꾸는 방법입니다.

즐겨...

감사


ngIf와 다른 ngIf를 사용하고 있습니다. NgIf는 DOM에서 요소를 제거 / 추가합니다. 이는 요소에 CSS 스타일 만 추가 / 제거하는 ngShow / ngHide와 동일하지 않습니다.
Gil Epshtain

예가 너무 길고 구체적입니다.
masterxilo 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.