Angular 2+ içindeki ngShow ve ngHide eşdeğeri nedir?


Yanıtlar:


950

Sadece hiddenmülke bağla

[hidden]="!myVar"

Ayrıca bakınız

sorunlar

hiddenyine de bazı sorunlar vardır çünkü displaymülk için CSS ile çakışabilir .

Bakın nasıl someyılında Plunker Örneğin bir tarzı vardır çünkü gizli almaz

:host {display: block;}

Ayarlamak. (Bu, diğer tarayıcılarda farklı davranabilir - Chrome 50 ile test ettim)

geçici çözüm

Ekleyerek düzeltebilirsiniz

[hidden] { display: none !important;}

Küresel bir stile index.html.

başka bir tuzak

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

ile aynı

hidden="true"

ve öğeyi göstermez.

hidden="false"dize atar "false"truthy kabul edilir.
Yalnızca değer falseveya özniteliğin kaldırılması öğeyi gerçekten görünür hale getirir.

Kullanmak {{}}ayrıca ifadeyi bir dizeye dönüştürür ve beklendiği gibi çalışmaz.

Bunun yerine atandığı için yalnızca ile bağlanma []beklendiği gibi çalışır .falsefalse"false"

*ngIf vs [hidden]

*ngIfözelliği [hidden]değiştirirken içeriğini DOM'dan etkili bir şekilde kaldırır displayve yalnızca tarayıcıya içeriği göstermemesini söyler, ancak DOM hala içerir.


21
Gizli kullanılması aslında önerilmez. angularjs.blogspot.com/2016/04/…
Sam

7
*ngIfçoğu durumda doğru yol olabilir, ancak bazen görsel olarak gizli bir öğenin orada olmasını istersiniz. Yardımcı olan bir CSS stili [hidden]{display:none!important}. Örneğin, Bootstrap [hidden]öğelerin aslında gizli olduğundan nasıl emin olur . GitHub
CunningFatalist

* MyIf içinde (myStream | async) borusunu da kullanan (myStream | async) borusunu kullandığınızda bir sorunla karşılaşabilirsiniz
Pavel Blagodov

1
sen benim kurtarıcımsın! * ngIf kullanıldığında DOM konumu en üste sıfırlanır ancak [gizli] sorunumu çözdü ve konumu korudu.
Santosh

1
Kişinin [gizli] üzerinde * ngIf kullanmak isteyebileceği bir durum, HostListener kullandığınızda (ve belge tıklamaları ile event.target arasında ayrım yapmak istediğinizde), öğeleri göstermeye ve gizlemeye çalışırken (özel açılır menüler gibi)
akhouri

140

Şu özelliği kullanın [hidden]:

[hidden]="!myVar"

Veya kullanabilirsiniz *ngIf

*ngIf="myVar"

Bunlar bir öğeyi göstermenin / gizlemenin iki yoludur. Tek fark şudur: *ngIföğeyi DOM'dan kaldırır, [hidden]tarayıcıya öğeyi DOM'da displaytutarak CSS özelliğini kullanarak bir öğeyi göstermesini / gizlemesini söyler .


3
[hidden], koşul öğesine öğeye "gizli" bir özellik ekliyor. Ayrıca [ne olursa olsun] veya [ali] olabilir. Burada önemli olan "gizli" özelliklerden bahseden bir CSS kuralı yüklemektir: yok
Gabriel

5
Unutmayın: * ngIf ve [gizli] temelden farklıdır. Koşul doğru oluncaya kadar * ngIf bloğu içindeki içeriği değerlendirmez. Bu özellikle asyncboruyu kullanırsanız önemlidir , çünkü gözlemlenebilir abonelik ancak koşul gerçekleştikten sonra eklenecektir!
Dynalon

2
Dikkate alınması gereken bir şey daha var: * ngIf bileşeni yok eder ve yeniden yaratılması gerekirken, [hidden] onu canlı ve bellekte tutar. Kaynak yoğun bir bileşeniniz varsa, onu yok etmek yerine gizlemek tercih edilebilir
Michael Kork.

1
onlar aynı şey değil.
Kamuran Sönecek

36

Kendimi benim durumumdaki elemanın esnek bir kap olduğu farkıyla aynı durumda buluyorum. Eğer durumunuz değilse kolay bir iş olabilir

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

Benim durumumda, desteklediğimiz birçok tarayıcı hala sorunları önlemek için satıcı önekine ihtiyaç duyması nedeniyle başka bir kolay çözüm için gittim

[class.is-loading]="isLoading"

o zaman CSS basit

&.is-loading { display: none } 

görüntülenen durum varsayılan sınıf tarafından işlenir.


1
Bu, bootstrap 4 invalid-feedbacksınıfı ile iyi çalışır .
Jess

25

Üzgünüm, Açısal 2 kullanırken güvensiz olduğu düşünülen gizli bağlamaya katılmıyorum. Bunun nedeni, gizli stilin, örneğin kullanarak

display: flex;

Önerilen yaklaşım daha güvenli olan * ngIf kullanmaktır. Daha fazla ayrıntı için lütfen resmi Açısal bloga bakın. Açısal 2 ile Kaçınılması Gereken 5 Çaylak Hatası

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

12
Tam gereksinimleri bilmeden bir şeyin kötü olduğunu söylemek acayip bir hata olduğunu düşünüyorum. Eğer bir eleman bir öğenin kaldırılmasını ve yok edilmesini ve eklenip yeniden oluşturulmasını istemiyorsa, *ngIfkötü bir seçimdir. Fakat sonuçların göz önünde bulundurulması gerektiği ve tuzaklara işaret etmek her zaman iyi bir fikirdir.
Günter Zöchbauer

2
Ne demek istediğini biliyorum. Bu benim sözüm değil acemi bir hata, Angular 2 resmi blogundan alınmıştır. Kimseyi incitmek istemiyorum. Yine de işaret ettiğin için teşekkürler.
Tim Hong

9
Evet, ngIfbu sorunun sorduğu soruya tam olarak cevap verdiğini sanmıyorum . İçeren bir sayfada bazı içeriği gizlemek istiyorum <router-outlet>. Eğer kullanırsam ngIf, çıkış noktasını bulamadığına dair bir hata alıyorum. Ben edilecek satış yeri lazım gizli benim veri yükleri, değil kadar devamsızlık benim veri yüklenene kadar.
Jason Swett

Sana katılıyorum, ama sahip olduğum sorun bir form göstermek ve * ngI kullanırsanız içine değerleri koymak istiyorum tanımlanmadığı hata olacak ve gizli özelliği ile iyi çalışıyor
Hazem HASAN

@HazemHASAN, tabi. Anlıyorum. Çözüm her zaman şartlıdır. Sizin durumunuzda, başka bir kod çalıştırmadan önce formun orada olup olmadığını kontrol etmenin mümkün olup olmadığından emin değilsiniz. Her şey değiş tokuş ile ilgilidir. Gelecekte yanlışlıkla başka bir stil tarafından dengelenmeyecek formu gizlemek için daha güvenli bir yol ister misiniz? Yoksa formun mevcut olup olmadığını kontrol etmemeyi tercih ediyor musunuz?
Tim Hong

4

Sizin durumunuz tarzı hiçbiri ise, ngStyle yönergesini de kullanabilir ve doğrudan ekranı değiştirebilirsiniz, bunu bir bootstrap için DropDown üzerindeki UL hiçbiri görüntüleyecek şekilde ayarlanmıştır.

Bu yüzden UL'yi görüntülemek için "manuel" olarak değiştirmek için bir tıklama etkinliği oluşturdum

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

Sonra bileşen her zaman geçiş yapmak showDropDown: bool özniteliği var ve int dayalı, stil için displayDDL aşağıdaki gibi ayarlayın

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

4

NgShow ve ngHide'ın Açısal 1 belgelerine göre , bu direktiflerin her ikisi de css stilini display: none !important;, bu direktifin durumuna göre öğeye ekler (ngShow için css yanlış değer ekler ve ngHide için css gerçek değer ekler).

Bu davranışı ngClass Açısal 2 yönergesini kullanarak başarabiliriz:

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

Bildirim için bu showAngular2 davranış biz eklemeniz gerekir !ngShowVal önce (değil) ve için hideAngular2 davranış biz yok eklemeniz gerekir !ngHideVal önce (değil).


4
<div [hidden]="myExpression">

myExpression doğru veya yanlış olarak ayarlanmış olabilir


2
<div hidden="{{ myExpression }}">"MyExpression", html'de oluşturulacak bir dizeye dönüştürüleceğinden bu çalışmaz. Hem "true" hem de "false" dizesi doğrudur, bu yüzden her zaman gizlenir
Viprus

3

Bootstrap kullanıyorsanız bu kadar basit:

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

3
Bootstrap 4 kullanarak [hidden]aynı şeyi yapar, bu yüzden tavsiye ederim[hidden]
Vahid

3

bootstrap 4.0'da "d-none" = "sınıfı görüntülenir: none! important;"

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

3

Bu meseleye rastlayan herkes için, ben bunu başardım.

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

Kullandım 'visibility'çünkü elementin kapladığı alanı korumak istedim. Bunu yapmak istemediyseniz, sadece 'display'onu kullanabilir ve ayarlayabilirsiniz 'none';

Dinamik olarak veya değil, html öğenize bağlayabilirsiniz.

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

veya

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

2

Herhangi bir modeli kontrol ile bağlar gibi gizli kullanın ve bunun için css belirtin :

HTML:

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

CSS:

[hidden] {
   display: none;
}

2

benim için işe yarayan buydu:

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


1

benim için [hidden]=!varhiç çalışmadı.

Yani, <div *ngIf="expression" style="display:none;">

Ve, <div *ngIf="expression">her zaman doğru sonuçları verin.


0

Açısal belgeler üzerinde iki örnek var https://angular.io/guide/structural-directives#why-remove-rather-than-hide

Bir yönerge, görüntüleme stilini none olarak ayarlayarak istenmeyen paragrafı gizleyebilir.

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

NgShow'u değiştirmek için [style.display] = "'block'" ve ngHide'ı değiştirmek için [style.display] = "'none'" kullanabilirsiniz.


0

Bu sorunu kullanarak başa çıkmanın en iyi yolu Bu ngIf , öğenin ön uçta oluşturulmasını önlediğinden,

Eğer [hidden]="true"gizleme kullanırsanız veya stil kullanırsanız [style.display], yalnızca ön uçtaki öğeyi gizler ve birisi değeri değiştirebilir ve kolayca görülebilir, Bence öğeyi gizlemenin en iyi yolungIf

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

ve ayrıca birden fazla öğeniz varsa (başka bir uygulama da yapmanız gerekir) Kullan <ng-template>seçeneğini kullanabilirsiniz

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

örnek ng-şablon kodu


0

AngularJS'nin birlikte geldiği simetrik hidden/ shownyönergeleri kullanmak istiyorsanız , şablonları basitleştirmek için bir öznitelik talimatı yazmanızı öneririm (Açısal 7 ile test edilmiştir):


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

Diğer çözümlerin çoğu doğrudur. Sen gerektiğini kullanmak *ngIfhiç mümkün olduğunca. Kullanılması hiddenniteliğini olabilir beklenmedik stili uygulandı var, ama diğerleri için bileşenler yazmadığınız sürece sorun olduğu takdirde muhtemelen biliyorsunuzdur. Dolayısıyla, bu showndirektifin çalışması için aşağıdakileri eklediğinizden emin olmak istersiniz:

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

bir yerde küresel stillerinize.

Bunlarla direktifi şu şekilde kullanabilirsiniz:

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

simetrik (ve zıt) versiyonla şöyle:

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

Gerekliliklere eklemek için - bize de [acmeShown]sadece vs gibi bir önek olmalıdır [shown].

Bir shownöznitelik yönergesini kullanmamın ana nedeni , gizlenen içerik XHR gidiş-dönüşlerine neden olan kap bileşenleri içerdiğinde AngularJS kodunu Angular -AND- biçimine dönüştürmektir. Sadece kullanmamanın nedeni [hidden]="!myVar", yeterince karmaşık olması gibi: [hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.[gösterilen] `hakkında düşünmek daha kolaydır.


-1

Div düğmesini gizlemek ve göstermek için açısal olarak tıklayın

HTML Kodu

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

Bileşen .ts Kodu

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

bu benim için işe yarıyor ve ng-hide ve ng-show'un açısal olarak değiştirilmesinin bir yoludur6.

zevk almak...

Teşekkürler


NgShow'dan farklı ngIf - kullanıyorsunuz. NgIf, DOM'dan öğeyi kaldıracak / ekleyecektir. Bu, Elemana yalnızca Css stilleri ekleyecek / kaldıracak olan ngShow / ngHide ile aynı değildir.
Gil Epshtain

Örnek çok uzun ve çok spesifik.
masterxilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.