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+?
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+?
Câu trả lời:
Chỉ cần liên kết với hidden
tài sản
[hidden]="!myVar"
Xem thêm
vấn đề
hidden
có một số vấn đề mặc dù vì nó có thể xung đột với CSS cho thuộc display
tính.
Xem làm thế nào some
trong 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ị false
hoặ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 false
thay vì "false"
.
*ngIf
đấu với [hidden]
*ngIf
loại bỏ hiệu quả nội dung của nó khỏi DOM trong khi [hidden]
sửa đổi thuộc display
tí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 đó.
*ngIf
có 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
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à: *ngIf
sẽ 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 display
tính CSS bằng cách giữ phần tử trong DOM.
async
đườ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!
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.
invalid-feedback
lớp bootstrap 4 .
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>
*ngIf
là 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.
ngIf
chí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.
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";
}
Theo tài liệu Angular 1 của ngShow và ngHide , 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 show
hành vi trong Angular2, chúng ta cần thêm !
(không) trước ngShowVal và đối với hide
hành vi trong Angular2, chúng ta không cần thêm !
(không) trước ngHideVal.
<div [hidden]="myExpression">
myExpression có thể được đặt thành đúng hoặc sai
<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
Đố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>
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;
}
đối với tôi, [hidden]=!var
chư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.
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.
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>
Nếu bạn chỉ muốn sử dụng các lệnh hidden
/ đối xứng shown
mà 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ứ *ngIf
khi nào có thể. Sử dụng hidden
thuộ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, để shown
chỉ 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 shown
chỉ 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.
Để ẩ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