Tương đương với ngShow và ngHide trong Angular 2+ là gì?


570

Tôi có một số yếu tố mà tôi muốn được hiển thị trong các điều kiện nhất định.

Trong AngularJS tôi sẽ viết

<div ng-show="myVar">stuff</div>

Làm thế nào tôi có thể làm điều này trong Angular 2+?


[hidden] = "! myVar" .. điều này hoạt động ở góc 2+
Pragati Dugar

Câu trả lời:


951

Chỉ cần liên kết với hiddentài sản

[hidden]="!myVar"

Xem thêm

vấn đề

hiddencó một số vấn đề mặc dù vì nó có thể xung đột với CSS cho thuộc displaytính.

Xem làm thế nào sometrong ví dụ Plunker không bị ẩn bởi vì nó có kiểu

:host {display: block;}

bộ. (Điều này có thể hoạt động khác trong các trình duyệt khác - Tôi đã thử nghiệm với Chrome 50)

cách giải quyết

Bạn có thể sửa nó bằng cách thêm

[hidden] { display: none !important;}

Để một phong cách toàn cầu trong index.html.

một cạm bẫy khác

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

giống như

hidden="true"

và sẽ không hiển thị các yếu tố.

hidden="false"sẽ gán chuỗi "false"được coi là trung thực.
Chỉ có giá trị falsehoặc loại bỏ thuộc tính sẽ thực sự làm cho phần tử hiển thị.

Việc sử dụng {{}}cũng chuyển đổi biểu thức thành một chuỗi và sẽ không hoạt động như mong đợi.

Chỉ ràng buộc với []sẽ làm việc như mong đợi vì điều này falseđược chỉ định falsethay vì "false".

*ngIf đấu với [hidden]

*ngIfloại bỏ hiệu quả nội dung của nó khỏi DOM trong khi [hidden]sửa đổi thuộc displaytính và chỉ hướng dẫn trình duyệt không hiển thị nội dung nhưng DOM vẫn chứa nội dung đó.


21
Sử dụng ẩn thực sự không được khuyến khích. angularjs.blogspot.com/2016/04/ khăn
Sam

7
*ngIfcó thể là cách chính xác trong hầu hết các trường hợp, nhưng đôi khi bạn thực sự muốn một yếu tố ở đó, ẩn đi một cách trực quan. Một phong cách CSS với sự [hidden]{display:none!important}giúp đỡ. Đó là, ví dụ, cách Bootstrap đảm bảo [hidden]các yếu tố thực sự bị ẩn. Xem GitHub
CuckyFirthist

Bạn có thể gặp một số vấn đề khi bạn sử dụng đường ống (myStream | async) bên trong * ngNếu đó cũng sử dụng đường ống (myStream | async)
Pavel Blagodov

1
bạn là vị cứu tinh của tôi sử dụng * ng If sẽ đặt lại vị trí DOM lên đầu nhưng [ẩn] đã giải quyết vấn đề của tôi và giữ nguyên vị trí.
Santosh

1
Một trường hợp người ta có thể muốn sử dụng [ẩn] trên * ngNếu là khi bạn đang sử dụng HostListener (và muốn phân biệt các lần nhấp vào tài liệu với event.target), khi cố gắng hiển thị và ẩn các phần tử (như với trình đơn thả xuống tùy chỉnh)
akhouri

140

Sử dụng [hidden]thuộc tính:

[hidden]="!myVar"

Hoặc bạn có thể sử dụng *ngIf

*ngIf="myVar"

Đây là hai cách để hiển thị / ẩn một phần tử. Sự khác biệt duy nhất là: *ngIfsẽ xóa phần tử khỏi DOM trong khi [hidden]sẽ yêu cầu trình duyệt hiển thị / ẩn phần tử bằng thuộc displaytính CSS bằng cách giữ phần tử trong DOM.


3
[hidden] đang thêm điều kiện một thuộc tính "ẩn" vào thành phần. Nó cũng có thể là [bất cứ thứ gì] hoặc [ali]. Điều quan trọng ở đây là tải một quy tắc CSS có đề cập đến các thuộc tính "ẩn" phải được hiển thị: không có gì
Gabriel

5
Hãy ghi nhớ: * ng If và [hidden] là basicyl khác nhau. ng If sẽ không đánh giá nội dung bên trong khối * ng If cho đến khi điều kiện là đúng. Điều này đặc biệt quan trọng nếu bạn sử dụngasync đường ống, vì đăng ký có thể quan sát sẽ chỉ được thêm sau khi điều kiện trở thành sự thật!
Dynalon

2
Một điều nữa cần xem xét là * ngNếu phá hủy thành phần và nó phải được tạo lại, trong khi [ẩn] giữ cho nó sống và trong bộ nhớ. Nếu bạn có một thành phần sử dụng nhiều tài nguyên, có thể tốt hơn là ẩn nó thay vì phá hủy nó
Michael Kork.

1
chúng không giống nhau
Kamuran Sönecek

36

Tôi thấy mình trong tình huống tương tự với sự khác biệt so với trong trường hợp của tôi, phần tử là một thùng chứa flex. Nếu không phải trường hợp của bạn, một công việc dễ dàng có thể là

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

trong trường hợp của tôi do thực tế là rất nhiều trình duyệt mà chúng tôi hỗ trợ vẫn cần tiền tố của nhà cung cấp để tránh các sự cố tôi đã tìm một giải pháp dễ dàng khác

[class.is-loading]="isLoading"

CSS thì đơn giản như

&.is-loading { display: none } 

để lại sau đó trạng thái hiển thị được xử lý bởi lớp mặc định.


1
Điều này hoạt động tốt với invalid-feedbacklớp bootstrap 4 .
Jess

25

Xin lỗi, tôi phải không đồng ý với ràng buộc với ẩn được coi là không an toàn khi sử dụng Angular 2. Điều này là do kiểu ẩn có thể được ghi đè dễ dàng, ví dụ như sử dụng

display: flex;

Cách tiếp cận được đề xuất là sử dụng * ngNếu an toàn hơn. Để biết thêm chi tiết, xin vui lòng tham khảo blog Angular chính thức. 5 sai lầm của tân binh cần tránh với Angular 2

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

12
Tôi nghĩ rằng đó là một sai lầm tân binh khi nói điều gì đó là xấu trước khi biết các yêu cầu chính xác. Nếu một người không muốn một phần tử bị loại bỏ và phá hủy và thêm và tái tạo, thì đó *ngIflà một lựa chọn kém. Nhưng bạn đã đúng rằng hậu quả cần được xem xét và chỉ ra những cạm bẫy luôn là một ý tưởng tốt.
Günter Zöchbauer

2
Tôi hiểu bạn muốn nói gì. Đó không phải là lời tôi nói về nó là một sai lầm mới làm quen, nó được lấy từ blog chính thức của Angular 2. Tôi không có ý xúc phạm bất cứ ai. Cảm ơn đã chỉ ra, mặc dù.
Tim Hồng

9
Vâng, tôi không nghĩ ngIfchính xác câu trả lời cho câu hỏi này. Tôi muốn ẩn một số nội dung trên một trang bao gồm a <router-outlet>. Nếu tôi sử dụng ngIf, tôi gặp một lỗi mà nó không thể tìm thấy ổ cắm. Tôi cần ẩn ổ cắm cho đến khi tải dữ liệu của tôi, không vắng mặt cho đến khi dữ liệu của tôi tải.
Jason Swett

Tôi đồng ý với bạn, nhưng vấn đề mà tôi gặp phải là tôi muốn hiển thị một biểu mẫu và đặt các giá trị vào đó nếu tôi sử dụng * ngNếu tôi sẽ gặp lỗi không được xác định và với thuộc tính ẩn nó hoạt động tốt
Hazem HASAN

@HazemHASAN, chắc chắn rồi. Tôi hiểu. Giải pháp luôn có điều kiện. Trong trường hợp của bạn, không chắc chắn liệu có thể chỉ kiểm tra xem biểu mẫu có ở đó không trước khi bạn chạy bất kỳ mã nào khác chống lại nó. Đó là tất cả về sự đánh đổi. Bạn có muốn một cách an toàn hơn để ẩn biểu mẫu sẽ không được bù đắp bởi kiểu dáng khác trong tương lai không? Hoặc bạn muốn có sự thuận tiện không kiểm tra nếu hình thức tồn tại?
Tim Hong

4

Nếu trường hợp của bạn là kiểu hiển thị, bạn cũng không thể sử dụng lệnh ngStyle và sửa đổi trực tiếp màn hình, tôi đã làm điều đó cho một bootstrap DropDown, UL trên nó được đặt thành không hiển thị.

Vì vậy, tôi đã tạo một sự kiện nhấp để "thủ công" bật tắt UL để hiển thị

<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>    

Sau đó, trên thành phần tôi có thuộc tính showDropDown: bool mà tôi chuyển đổi mọi lúc và dựa trên int, đặt displayDDL cho kiểu như sau

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

4

Theo tài liệu Angular 1 của ngShowngHide , cả hai chỉ thị này đều thêm kiểu cssdisplay: none !important; , vào phần tử theo điều kiện của lệnh đó (đối với ngShow thêm css vào giá trị sai và cho ngHide thêm css cho giá trị thực).

Chúng ta có thể đạt được hành vi này bằng cách sử dụng lệnh 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>

Lưu ý rằng đối với showhành vi trong Angular2, chúng ta cần thêm !(không) trước ngShowVal và đối với hidehành vi trong Angular2, chúng ta không cần thêm !(không) trước ngHideVal.


4
<div [hidden]="myExpression">

myExpression có thể được đặt thành đúng hoặc sai


2
<div hidden="{{ myExpression }}">Điều này sẽ không hoạt động, vì "myExpression" sẽ được chuyển đổi thành một chuỗi được hiển thị trong html. Cả chuỗi "đúng" và "sai" đều là sự thật, vì vậy nó sẽ luôn bị ẩn
Viprus

3

Nếu bạn đang sử dụng Bootstrap thì đơn giản như thế này:

<div [class.hidden]="myBooleanValue"></div>

3
Trong bootstrap 4, sử dụng [hidden]tương tự như vậy, tôi khuyên bạn nên[hidden]
Vahid

3

trong bootstrap 4.0, lớp "d-none" = "display: none! Quan trọng;"

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

3

Đối với bất kỳ ai khác vấp phải vấn đề này, đây là cách tôi hoàn thành nó.

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');
    }
  }
}

Tôi đã sử dụng 'visibility'vì tôi muốn bảo tồn không gian bị chiếm bởi phần tử. Nếu bạn không muốn làm như vậy, bạn có thể sử dụng 'display'và đặt nó thành 'none';

Bạn có thể liên kết nó với phần tử html của bạn, một cách linh hoạt hoặc không.

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

hoặc là

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

2

Sử dụng ẩn như bạn liên kết bất kỳ mô hình nào với điều khiển và chỉ định css cho nó:

HTML:

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

CSS:

[hidden] {
   display: none;
}

2

Đây là những gì làm việc cho tôi:

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


1

đối với tôi, [hidden]=!varchưa bao giờ làm việc

Vì thế, <div *ngIf="expression" style="display:none;">

Và, <div *ngIf="expression">Luôn luôn cho kết quả chính xác.


0

Có hai ví dụ về các tài liệu Angular https://angular.io/guide/structural-directives#why-remove-rather-than- leather

Một lệnh có thể ẩn đoạn không mong muốn thay vào đó bằng cách đặt kiểu hiển thị của nó thành không.

<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>

Bạn có thể sử dụng [style.display] = "'block'" để thay thế ngShow và [style.display] = "'none'" để thay thế ngHide.


0

Cách tốt nhất để giải quyết vấn đề này bằng cách sử dụng ngIf Bởi vì điều này cũng ngăn chặn việc phần tử đó hiển thị ở mặt trước,

Nếu bạn sử dụng [hidden]="true"hoặc ẩn kiểu, [style.display]nó sẽ chỉ ẩn phần tử ở mặt trước và ai đó có thể thay đổi giá trị và hiển thị nó dễ dàng, theo tôi cách tốt nhất để ẩn phần tử làngIf

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

và ngoài ra Nếu bạn có nhiều yếu tố (cũng cần phải thực hiện khác), bạn có thể sử dụng <ng-template>tùy chọn

<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>  

mẫu ng-mẫu mã


0

Nếu bạn chỉ muốn sử dụng các lệnh hidden/ đối xứng shownmà AngularJS đi kèm, tôi khuyên bạn nên viết một chỉ thị thuộc tính để đơn giản hóa các mẫu như vậy (đã thử nghiệm với 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';
  }
}

Nhiều giải pháp khác là chính xác. Bạn nên sử dụng bất cứ *ngIfkhi nào có thể. Sử dụng hiddenthuộc tính có thể có các kiểu không mong muốn được áp dụng, nhưng trừ khi bạn đang viết các thành phần cho người khác, bạn có thể biết nếu có. Vì vậy, để shownchỉ thị này hoạt động, bạn cũng sẽ muốn đảm bảo rằng bạn thêm:

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

phong cách toàn cầu của bạn ở đâu đó.

Với những điều này, bạn có thể sử dụng lệnh như vậy:

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

với phiên bản đối xứng (và ngược lại) như vậy:

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

Để thêm vào các shoulds - yous cũng nên cho chúng ta một tiền tố như vậy [acmeShown]vs chỉ [shown].

Lý do chính tôi đã sử dụng một shownchỉ thị thuộc tính là để chuyển đổi mã AngularJS thành Angular -AND- khi nội dung bị ẩn chứa các thành phần container gây ra các chuyến đi khứ hồi XHR. Lý do tôi không chỉ sử dụng [hidden]="!myVar"là thường đủ phức tạp như: [hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.[hiển thị] `đơn giản là dễ suy nghĩ hơn.


-1

Để ẩn và hiển thị div trên nút bấm vào góc 6.

Mã HTML

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

Mã thành phần .ts

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

điều này làm việc cho tôi và nó là cách để thay thế ng-hide và ng-show trong angular6.

thưởng thức...

Cảm ơn


Bạn đang sử dụng ng If - khác với ngShow. Ng If sẽ xóa / thêm phần tử từ DOM. Điều này không giống với ngShow / ngHide, nó sẽ chỉ thêm / xóa các kiểu Css cho Element.
Gil Epshtain

Ví dụ quá dài và quá cụ thể.
masterxilo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.