Qual è l'equivalente di ngShow e ngHide in Angular 2+?


Risposte:


951

Basta legare alla hiddenproprietà

[hidden]="!myVar"

Guarda anche

problemi

hiddenha alcuni problemi però perché può essere in conflitto con CSS per la displayproprietà.

Guarda come somenell'esempio di Plunker non viene nascosto perché ha uno stile

:host {display: block;}

impostato. (Questo potrebbe comportarsi in modo diverso in altri browser - ho testato con Chrome 50)

soluzione

Puoi risolverlo aggiungendo

[hidden] { display: none !important;}

Ad uno stile globale in index.html.

un'altra trappola

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

sono gli stessi di

hidden="true"

e non mostrerà l'elemento.

hidden="false"assegnerà la stringa "false"considerata vera.
Solo il valore falseo la rimozione dell'attributo renderà effettivamente visibile l'elemento.

L'uso {{}}converte anche l'espressione in una stringa e non funzionerà come previsto.

Solo il binding con []funzionerà come previsto perché falseassegnato come falseanziché "false".

*ngIf vs [hidden]

*ngIfrimuove efficacemente il suo contenuto dal DOM mentre [hidden]modifica la displayproprietà e indica solo al browser di non mostrare il contenuto ma il DOM lo contiene ancora.


21
L'uso di nascosto non è attualmente raccomandato. angularjs.blogspot.com/2016/04/…
Sam

7
*ngIfpuò essere il modo corretto nella maggior parte dei casi, ma a volte in realtà vuoi che un elemento sia lì, visivamente nascosto. Uno stile CSS con [hidden]{display:none!important}aiuti. Questo è, ad esempio, il modo in cui Bootstrap si assicura che gli [hidden]elementi siano effettivamente nascosti. Vedi GitHub
CunningFatalist

Potresti riscontrare qualche problema quando usi la pipe (myStream | async) all'interno di * ngIf che utilizza anche la pipe (myStream | async)
Pavel Blagodov,

1
tu sei il mio salvatore! usando * ngIf reimposterai la posizione DOM in alto ma [nascosto] risolve il mio problema e conserva la posizione.
Santosh,

1
Un caso in cui si potrebbe voler usare [nascosto] su * ngIf è quando si utilizza HostListener (e si desidera differenziare i clic del documento rispetto a event.target), quando si tenta di mostrare e nascondere elementi (come con i
menu a

141

Usa l' [hidden]attributo:

[hidden]="!myVar"

Oppure puoi usare *ngIf

*ngIf="myVar"

Questi sono due modi per mostrare / nascondere un elemento. L'unica differenza è: *ngIfrimuoverà l'elemento dal DOM mentre [hidden]dirà al browser di mostrare / nascondere un elemento usando la displayproprietà CSS mantenendo l'elemento in DOM.


3
[nascosto] sta aggiungendo condizionalmente un attributo "nascosto" all'elemento. Potrebbe anche essere [qualunque cosa] o [ali]. La cosa importante qui è caricare una regola CSS che menzioni gli attributi "nascosti" che devono essere visualizzati: nessuno
Gabriel

5
Ricorda: * ngIf e [nascosto] sono fondamentalmente diversi. ngIf non valuterà il contenuto all'interno del blocco * ngIf fino a quando la condizione non è vera. Ciò è particolarmente importante se si utilizza la asyncpipe, poiché l'abbonamento all'osservabile verrà aggiunto solo quando la condizione diventa vera!
Dynalon,

2
Un'altra cosa da prendere in considerazione è che * ngSe distrugge il componente e deve essere ricreato, mentre [nascosto] lo mantiene in vita e in memoria. Se hai un componente ad alta intensità di risorse, potrebbe essere preferibile nasconderlo invece di distruggerlo
Michael Kork.

1
non sono la stessa cosa.
Kamuran Sönecek,

36

Mi trovo nella stessa situazione con la differenza rispetto al mio caso l'elemento era un contenitore flessibile. Se non è il tuo caso, una soluzione semplice potrebbe essere

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

nel mio caso a causa del fatto che molti browser che supportiamo hanno ancora bisogno del prefisso del fornitore per evitare problemi, ho optato per un'altra soluzione semplice

[class.is-loading]="isLoading"

dove quindi il CSS è semplice come

&.is-loading { display: none } 

per lasciare quindi lo stato visualizzato gestito dalla classe predefinita.


1
Funziona bene con bootstrap 4 invalid-feedbackclasse.
Jess,

25

Spiacenti, non sono d'accordo con l'associazione a nascosto che è considerato non sicuro quando si utilizza Angular 2. Questo perché lo stile nascosto potrebbe essere sovrascritto facilmente, ad esempio utilizzando

display: flex;

L'approccio raccomandato è usare * ngIf che è più sicuro. Per maggiori dettagli, consultare il blog angolare ufficiale. 5 errori da principiante da evitare con Angular 2

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

12
Penso che sia un errore da principiante dire che qualcosa non va prima di conoscere i requisiti esatti. Se non si desidera che un elemento venga rimosso, distrutto, aggiunto e ricreato, *ngIfè una scelta sbagliata. Ma hai ragione nel considerare le conseguenze e sottolineare le insidie ​​è sempre una buona idea.
Günter Zöchbauer,

2
So cosa vuoi dire. Non è la mia parola, è un errore da principiante, è tratto dal blog ufficiale di Angular 2. Non intendo offendere nessuno. Grazie per averlo sottolineato, però.
Tim Hong

9
Sì, non credo ngIfche risponda esattamente a ciò che questa domanda sta ponendo. Voglio nascondere alcuni contenuti in una pagina che include a <router-outlet>. Se uso ngIf, ricevo un errore che non riesce a trovare la presa. Ho bisogno che la presa sia nascosta fino al caricamento dei miei dati, non assente fino al caricamento dei miei dati.
Jason Swett,

Sono d'accordo con te, ma il problema che ho è che voglio mostrare un modulo e inserire valori in esso se uso * ngSe avrò l'errore che non è definito e con la proprietà nascosta funziona bene
Hazem HASAN,

@HazemHASAN, certo. Capisco. La soluzione è sempre condizionata. Nel tuo caso, non sei sicuro che sia possibile controllare se il modulo è lì prima di eseguire qualsiasi altro codice contro di esso. Si tratta solo del compromesso. Vuoi un modo più sicuro per nascondere la forma che non sarà compensata accidentalmente da un altro stile in futuro? O preferisci avere la comodità di non controllare se il modulo esiste?
Tim Hong

4

Se il tuo caso è che lo stile è display none, puoi anche usare la direttiva ngStyle e modificare direttamente il display, ho fatto che per un bootstrap DropDown l'UL su di esso è impostato per non visualizzare nessuno.

Quindi ho creato un evento clic per "manualmente" attivare / disattivare la visualizzazione dell'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>    

Quindi sul componente ho showDropDown: attributo bool che commuto ogni volta e, in base a int, imposta displayDDL per lo stile come segue

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

4

Secondo la documentazione Angolare 1 di ngShow e ngHide , entrambe queste direttive aggiungono lo stile css display: none !important;, all'elemento secondo la condizione di quella direttiva (per ngShow aggiunge il css su falso valore, e per ngHide aggiunge il css per valore reale).

Possiamo ottenere questo comportamento usando la direttiva 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>

Si noti che per il showcomportamento in Angular2 è necessario aggiungere !(non) prima di ngShowVal e per il hidecomportamento in Angular2 non è necessario aggiungere !(non) prima di ngHideVal.


4
<div [hidden]="myExpression">

myExpression può essere impostato su true o false


2
<div hidden="{{ myExpression }}">Questo non funzionerà, poiché "myExpression" verrà convertito in una stringa da renderizzare nell'html. Sia la stringa "vero" che "falso" sono veritiere, quindi sarà sempre nascosta
Viprus,


3

in bootstrap 4.0 la classe "d-none" = "display: none! important;"

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

3

Per chiunque altro si imbattesse in questo problema, ecco come l'ho realizzato.

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

L'ho usato 'visibility'perché volevo preservare lo spazio occupato dall'elemento. Se non desideri farlo, puoi semplicemente utilizzarlo 'display'e impostarlo su 'none';

Puoi associarlo al tuo elemento html, in modo dinamico o meno.

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

o

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

2

Usa nascosto come se legassi qualsiasi modello con controllo e specifichi css per esso:

HTML:

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

CSS:

[hidden] {
   display: none;
}

2

Questo è ciò che ha funzionato per me:

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

1
<div [hidden]="flagValue">
---content---
</div>

1

per me, [hidden]=!varnon ha mai funzionato.

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

E, <div *ngIf="expression">Dai sempre risultati corretti.


0

Ci sono due esempi di documenti angolari https://angular.io/guide/structural-directives#why-remove-rather-than-hide

Una direttiva potrebbe invece nascondere il paragrafo indesiderato impostando il suo stile di visualizzazione su nessuno.

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

Puoi usare [style.display] = "'block'" per sostituire ngShow e [style.display] = "'none'" per sostituire ngHide.


0

Il modo migliore per affrontare questo problema usando ngIf Perché questo ben impedisce di ottenere quell'elemento render in front-end,

Se usi [hidden]="true"o nascondi stile nasconde [style.display]solo l'elemento nel front-end e qualcuno può modificare il valore e visualizzarlo facilmente, secondo me il modo migliore per nascondere l'elemento èngIf

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

e anche Se hai più elementi (devi implementare anche qualcos'altro) puoi usare l' <ng-template>opzione

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

codice di esempio ng-template


0

Se vuoi solo usare le direttive simmetriche hidden/ shownfornite da AngularJS, ti suggerisco di scrivere una direttiva di attributo per semplificare i template in questo modo (testato con 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';
  }
}

Molte delle altre soluzioni sono corrette. Si consiglia di utilizzare *ngIfdove mai possibile. Utilizzando l' hiddenattributo è possibile applicare stili imprevisti, ma a meno che non si stiano scrivendo componenti per altri, probabilmente si sa se lo è. Quindi per shownfar funzionare questa direttiva, ti consigliamo anche di aggiungere:

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

ai tuoi stili globali da qualche parte.

Con questi puoi usare la direttiva in questo modo:

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

con la versione simmetrica (e opposta) in questo modo:

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

Per aggiungere ai shoulds - yous dovrebbe anche un prefisso in questo modo [acmeShown]vs solo[shown] .

Il motivo principale per cui ho usato una showndirettiva di attributo è per convertire il codice AngularJS in angolare -AND- quando il contenuto nascosto contiene componenti contenitore che causano round trip XHR. Il motivo per cui non uso solo [hidden]="!myVar"è che abbastanza spesso è più complicato del tipo: [hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.[mostrato] `è semplicemente più facile da pensare.


-1

Per nascondere e mostrare il pulsante div on, fare clic su nell'angolo 6.

Codice HTML

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

Codice componente .ts

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

questo funziona per me ed è il modo di sostituire ng-hide e ng-show in angular6.

godere...

Grazie


Stai usando ngIf - che è diverso da ngShow. NgIf rimuoverà / aggiungerà l'elemento dal DOM. Questo non è lo stesso di ngShow / ngHide che aggiungerà / rimuoverà solo gli stili Css nell'elemento.
Gil Epshtain,

L'esempio è troppo lungo e troppo specifico.
masterxilo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.