ocultar mostrar elementos elemento div con change typescript angular

typescript - elementos - Angular 2 Mostrar y Ocultar un elemento



ocultar div angular 6 (9)

Tengo un problema para ocultar y mostrar un elemento que depende de una variable booleana en Angular 2.

Este es el código para que el div muestre y oculte:

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div>

la variable está "editada" y se almacena en mi componente:

export class AppComponent implements OnInit{ (...) public edited = false; (...) saveTodos(): void { //show box msg this.edited = true; //wait 3 Seconds and hide setTimeout(function() { this.edited = false; console.log(this.edited); }, 3000); } }

El elemento está oculto, cuando se inicia la función saveTodos, se muestra el elemento, pero después de 3 segundos, incluso si la variable vuelve a ser falsa, el elemento no se oculta. ¿Por qué?


Cuando no le importa eliminar el elemento Dom HTML, use * ngIf.

De lo contrario, use esto:

<div [style.visibility]="(numberOfUnreadAlerts == 0) ? ''hidden'' : ''visible'' "> COUNTER: {{numberOfUnreadAlerts}} </div>


Debe usar la directiva * ngIf

<div *ngIf="edited" class="alert alert-success box-msg" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div> export class AppComponent implements OnInit{ (...) public edited = false; (...) saveTodos(): void { //show box msg this.edited = true; //wait 3 Seconds and hide setTimeout(function() { this.edited = false; console.log(this.edited); }.bind(this), 3000); } }

Actualización: le falta la referencia al alcance externo cuando está dentro de la devolución de llamada de tiempo de espera.

así que agregue el .bind (esto) como agregué arriba

P: editado es una variable global. ¿Cuál sería su enfoque dentro de un * ngFor-loop? - Blauhirn

R: Agregaría editar como una propiedad al objeto sobre el que estoy iterando.

<div *ngFor="let obj of listOfObjects" *ngIf="obj.edited" class="alert alert-success box-msg" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div> export class AppComponent implements OnInit{ public listOfObjects = [ { name : ''obj - 1'', edit : false }, { name : ''obj - 2'', edit : false }, { name : ''obj - 2'', edit : false } ]; saveTodos(): void { //show box msg this.edited = true; //wait 3 Seconds and hide setTimeout(function() { this.edited = false; console.log(this.edited); }.bind(this), 3000); } }


Dependiendo de sus necesidades, *ngIf o [ngClass]="{hide_element: item.hidden}" donde la clase CSS hide_element es { display: none; } { display: none; }

*ngIf puede causar problemas si está cambiando las variables de estado *ngIf está eliminando, en esos casos usando la display: none; CSS display: none; es requerido.


Este es un buen caso de uso para una directiva. Algo como esto es sorprendentemente útil.

@Directive({selector: ''[removeAfter]''}) export class RemoveAfter { constructor(readonly element: ElementRef<HTMLElement>) { } /** * Removes the attributed element after the specified number of milliseconds. * Defaults to (1000) */ @Input() removeAfter = 1000; ngOnInit() { setTimeout(() => { this.element.nativeElement.remove(); }, this.removeAfter); } }


Hay dos opciones dependiendo de lo que quieras lograr:

  1. Puede usar la directiva oculta para mostrar u ocultar un elemento

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div>

  2. Puede usar la directiva de control ngIf para agregar o eliminar el elemento. Esto es diferente de la directiva oculta porque no muestra / oculta el elemento, pero agrega / elimina del DOM. Puede perder datos no guardados del elemento. Puede ser la mejor opción para un componente de edición que se cancela.

    <div *ngIf="edited" class="alert alert-success box-msg" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div>

Para su problema de cambio después de 3 segundos, puede deberse a una incompatibilidad con setTimeout. ¿Incluyó la biblioteca angular2-polyfills.js en su página?


La solución @inoabrian anterior funcionó para mí. Me encontré con una situación en la que actualizaría mi página y mi elemento oculto volvería a aparecer en mi página. Esto es lo que hice para resolverlo.

export class FooterComponent implements OnInit { public showJoinTodayBtn: boolean = null; ngOnInit() { if (condition is true) { this.showJoinTodayBtn = true; } else { this.showJoinTodayBtn = false; } }


Para que el componente secundario muestre que estaba usando *ngif="selectedState == 1"

En lugar de eso, usé [hidden]="selectedState!=1"

Funcionó para mí ... cargar el componente hijo correctamente y después de ocultar y no ocultar el componente hijo no estaba indefinido después de usar esto.


Podemos hacerlo usando el siguiente fragmento de código.

Código Angular:

export class AppComponent { toggoleShowHide:string ="visible"; }

Plantilla HTML:

Enter text to hide or show item in bellow: <input type="text" [(ngModel)]="toggoleShowHide"> <br> Toggle Show/hide: <div [style.visibility]="toggoleShowHide"> Final Release Angular 2! </div>


Simplemente agregue bind (this) en su función setTimeout, comenzará a funcionar

setTimeout(function() { this.edited = false; console.log(this.edited); }.bind(this), 3000);

y en cambio de HTML

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div>

A

<div *ngIf="edited" class="alert alert-success alert-dismissible fade in" role="alert"> <strong>List Saved!</strong> Your changes has been saved. </div>