Açısal 2 Bir öğeyi Göster ve Gizle


174

Açısal 2'de bir boole değişkenine bağlı olarak bir öğeyi gizleme ve gösterme konusunda sorun yaşıyorum.

div'in göstermesi ve gizlenmesi için kod:

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

değişken "düzenlenir" ve benim bileşenimde saklanır:

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

Öğe gizlenir, saveTodos işlevi başladığında öğe gösterilir, ancak 3 saniye sonra değişken yanlış olarak geri gelse bile öğe gizlenmez. Neden?

Yanıtlar:


167

* NgIf Direktifini kullanmalısınız

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

Güncelleme: Zaman Aşımı geri araması içindeyken dış kapsama referansı kaçırıyorsunuz.

Bu yüzden yukarıda eklediğim gibi .bind (this) öğesini ekleyin

S: edited, global bir değişkendir. * NgFor-loop içindeki yaklaşımınız ne olurdu? - Blauhirn

C: Yinelediğim nesneye özellik olarak düzenleme eklerdim.

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

editedküresel bir değişkendir. A içindeki yaklaşımınız ne olurdu *ngFor-loop?
phil294

Düzenlenen global bir değişken olmaz, bileşene aittir. Yukarıdaki cevabı ekleyeceğim.
inoabrian

Zamanlayıcıya küresel olarak nasıl erişilir?
Kumaresan Perumal

1
Bazı açısal malzeme bileşenlerinin mat-sayfalayıcı gibi düzgün başlamamasına ve çalışmamasına neden olur. [gizli] kullanmak bazı durumlarda daha iyi bir seçimdir.
AmirHossein Rezaei

186

Neyi başarmak istediğinize bağlı olarak iki seçenek vardır:

  1. Bir öğeyi göstermek veya gizlemek için gizli yönergeyi kullanabilirsiniz

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
  2. Elemanı eklemek veya çıkarmak için ngIf kontrol yönergesini kullanabilirsiniz. Bu, gizli yönerge ile farklıdır, çünkü öğeyi göstermez / gizlemez, ancak DOM ekler / kaldırır. Öğenin kaydedilmemiş verilerini kaybedebilirsiniz. İptal edilen bir düzenleme bileşeni için daha iyi bir seçim olabilir.

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

3 saniye sonra değişiklik sorunu için, setTimeout ile uyumsuzluktan kaynaklanabilir. Sayfanıza angular2-polyfills.js kütüphanesini eklediniz mi?


5
[hidden]="edited"herhangi bir etkisi yok gibi görünüyor ...?
phil294

5
Gizli sorunlarınız varsa, lütfen global css'nizdeki stackoverflow.com/a/35578093/873282 : yanıtını izleyin [hidden] { display: none !important;}.
koppor

30

Html Dom-Elementini kaldırmayı umursamadığınızda * ngIf kullanın.

Aksi takdirde şunu kullanın:

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

14

Alt bileşenin kullandığımı göstermesi için *ngif="selectedState == 1"

Bunun yerine kullandım [hidden]="selectedState!=1"

Benim için işe yaradı .. Alt bileşeni düzgün bir şekilde yüklemek ve alt bileşeni gizlemek ve kaldırmak sonra bu bileşeni kullandıktan sonra tanımsız değildi.


6

Bu bir direktif için iyi bir kullanım durumudur. Böyle bir şey şaşırtıcı derecede faydalıdır.

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

Fikri seviyorum, ama bu elementi tamamen kaldıracak. Bunu yeniden olabilir ama bu muhtemelen nedeniyle elemanı gizlemez yüzden postu olarak değiştirdim ngIfolduğunu true. Bunu kontrol eden ebeveynin değişkenini ayarlamanın bir yolu var mı false?
aralık

Kaldır'ı çağırmak yerine gizli bir sınıf veya başka bir şey ekleyemez misiniz? Bu teknik oldukça geneldir.
Aluan Haddad

Bence sorun ngIfDOM'da olup olmadığı için daha fazla. Ne istediğim bu: <div [hidden]="messages" [removeAfter]=3000>...nerede varsa mesajları göstermek / gizlemek ve daha sonra kullanıcı kutusunu kapatmak zorunda kalmadan 3 saniye sonra mesajları kaldırmak. Yukarıdaki direktifinizi ekledim ve bunu yapmak için değiştirdim hide()ancak mesajlar gösterildiğinde çağrılmıyor. Etkinliğe davet edilmesini nasıl sağlayabilirim? @Output()ve EventEmitter?
aralık

4

Bunu aşağıdaki kod snippet'ini kullanarak yapabiliriz.

Açısal Kod:

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

HTML Şablonu:

  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

İhtiyaçlarınıza *ngIfveya [ngClass]="{hide_element: item.hidden}"CSS sınıfının nerede hide_elementolduğuna bağlı olarak{ display: none; }

*ngIfdurum değişkenlerini değiştiriyorsanız sorunlara neden olabilir *ngIf, bu durumlarda CSS kullanmak display: none;gerekir.


0

Yukarıdaki @inoabrian çözümü benim için çalıştı. Sayfamı yenileyeceğim ve gizli öğemin sayfamda yeniden görüneceği bir durumla karşılaştım. İşte bunu çözmek için yaptım.

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

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

0

Sadece setTimeout fonksiyonunuza bind (this) ekleyin ve çalışmaya başlayacaktır.

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

ve HTML değişikliğinde

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

için

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