Angular 2 Tampilkan dan Sembunyikan elemen


174

Saya mengalami masalah menyembunyikan dan menampilkan elemen tergantung dari variabel boolean di Angular 2.

ini kode untuk div untuk ditampilkan dan disembunyikan:

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

variabel "diedit" dan disimpan di komponen saya:

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

Elemen disembunyikan, ketika fungsi saveTodos dimulai, elemen ditampilkan, tetapi setelah 3 detik, bahkan jika variabel kembali menjadi salah, elemen tidak disembunyikan. Mengapa?

Jawaban:


167

Anda harus menggunakan Petunjuk * 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);
  }
}

Pembaruan: Anda kehilangan referensi ke lingkup luar saat Anda berada di dalam callback Timeout.

jadi tambahkan .bind (ini) seperti saya tambahkan di atas

T: diedit adalah variabel global. Apa yang akan menjadi pendekatan Anda dalam * ngFor-loop? - Blauhirn

A: Saya akan menambahkan edit sebagai properti ke objek yang saya iterasi.

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

editedadalah variabel global. Apa yang akan menjadi pendekatan Anda dalam suatu *ngFor-loop?
phil294

Diedit tidak akan menjadi variabel global, itu milik komponen. Saya akan menambahkan jawaban di atas.
inoabrian

bagaimana cara mengakses timer secara global dari layanan?
Kumaresan Perumal

1
ngif menyebabkan beberapa komponen bahan sudut gagal untuk menginisialisasi dan bekerja dengan baik, seperti mat-paginator. Saya pikir menggunakan [tersembunyi] adalah pilihan yang lebih baik untuk beberapa kasus.
AmirHossein Rezaei

186

Ada dua opsi tergantung apa yang ingin Anda capai:

  1. Anda dapat menggunakan arahan tersembunyi untuk menampilkan atau menyembunyikan elemen

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
  2. Anda dapat menggunakan arahan kontrol ngIf untuk menambah atau menghapus elemen. Ini berbeda dengan arahan tersembunyi karena tidak menampilkan / menyembunyikan elemen, tetapi menambah / menghapus dari DOM. Anda bisa kehilangan data elemen yang belum disimpan. Ini bisa menjadi pilihan yang lebih baik untuk komponen edit yang dibatalkan.

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

Bagi Anda masalah perubahan setelah 3 detik, itu bisa jadi karena ketidakcocokan dengan setTimeout. Apakah Anda memasukkan perpustakaan angular2-polyfills.js di halaman Anda?


5
[hidden]="edited"tampaknya tidak memiliki efek apa pun ...?
phil294

5
Jika Anda memiliki masalah dengan tersembunyi, silakan ikuti jawaban stackoverflow.com/a/35578093/873282 : [hidden] { display: none !important;}di css global Anda.
koppor

30

Ketika Anda tidak peduli tentang menghapus Html Dom-Element, gunakan * ngIf.

Kalau tidak, gunakan ini:

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

14

Untuk komponen anak untuk menunjukkan saya gunakan *ngif="selectedState == 1"

Alih-alih itu saya gunakan [hidden]="selectedState!=1"

Ini bekerja untuk saya .. memuat komponen anak dengan benar dan setelah hide dan un-hide komponen anak tidak terdefinisi setelah menggunakan ini.


6

Ini adalah kasus penggunaan yang baik untuk arahan. Sesuatu seperti ini sangat berguna.

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

Saya suka idenya, tetapi ini akan menghapus elemen sepenuhnya. Saya mengubahnya untuk disembunyikan, sehingga Anda dapat menggunakannya kembali tetapi itu tidak menyembunyikan elemen mungkin karena ngIfitu true. Apakah ada cara untuk mengatur variabel induk yang mengontrol ini false?
occasl

Tidak bisakah Anda menambahkan kelas tersembunyi atau sesuatu alih-alih memanggil hapus? Teknik ini cukup umum.
Aluan Haddad

Saya pikir masalahnya ngIflebih pada apakah elemen dalam DOM atau tidak. Yang saya inginkan adalah ini: <div [hidden]="messages" [removeAfter]=3000>...tempat saya menampilkan / menyembunyikan pesan jika ada dan kemudian menghapus pesan setelah 3 detik sehingga pengguna tidak perlu menutup kotak. Saya menambahkan arahan Anda di atas dan mengubahnya untuk melakukan hide()tetapi itu tidak dipanggil ketika pesan ditampilkan. Bagaimana saya membuatnya dipanggil pada acara tersebut? @Output()dan EventEmitter?
occasl

4

Kita dapat melakukannya dengan menggunakan cuplikan kode di bawah ini ..

Kode Sudut:

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

Templat HTML:

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

3

Tergantung pada kebutuhan Anda, *ngIfatau [ngClass]="{hide_element: item.hidden}"di mana kelas CSS hide_elementadalah{ display: none; }

*ngIfdapat menyebabkan masalah jika Anda mengubah variabel status *ngIfdihapus, dalam kasus display: none;itu diperlukan CSS .


0

Solusi @inoabrian di atas berhasil untuk saya. Saya mengalami situasi di mana saya akan menyegarkan halaman saya dan elemen tersembunyi saya akan muncul kembali di halaman saya. Inilah yang saya lakukan untuk mengatasinya.

export class FooterComponent implements OnInit {
public showJoinTodayBtn: boolean = null;

ngOnInit() {
      if (condition is true) {
        this.showJoinTodayBtn = true;
      } else {
        this.showJoinTodayBtn = false;
      }
}

0

Cukup tambahkan bind (ini) di fungsi setTimeout Anda, itu akan mulai berfungsi

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

dan dalam perubahan 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>

Untuk

<div *ngIf="edited" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.