Winkel 2 Ein Element ein- und ausblenden

174

Ich habe ein Problem beim Ausblenden und Anzeigen eines Elements in Abhängigkeit von einer booleschen Variablen in Angular 2.

Dies ist der Code, den das Div ein- und ausblenden soll:

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

Die Variable ist "bearbeitet" und in meiner Komponente gespeichert:

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

Das Element wird ausgeblendet. Wenn die Funktion saveTodos gestartet wird, wird das Element angezeigt. Nach 3 Sekunden wird das Element jedoch nicht ausgeblendet, selbst wenn die Variable wieder falsch ist. Warum?


quelle

Antworten:

167

Sie sollten die * ngIf-Direktive verwenden

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

Update: Sie vermissen den Verweis auf den äußeren Bereich, wenn Sie sich innerhalb des Timeout-Rückrufs befinden.

Fügen Sie also die .bind (dies) hinzu, wie ich oben hinzugefügt habe

F: Bearbeitet ist eine globale Variable. Was wäre Ihr Ansatz innerhalb einer * ngFor-Schleife? - Blauhirn

A: Ich würde dem Objekt, über das ich iteriere, edit als Eigenschaft hinzufügen.

<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);
  }
}
inoabrian
quelle
editedist eine globale Variable. Was wäre Ihr Ansatz innerhalb eines *ngFor-loop?
Phil294
Bearbeitet wäre keine globale Variable, sie gehört zur Komponente. Ich werde die Antwort oben hinzufügen.
Inoabrian
Wie kann ich vom Service aus global auf den Timer zugreifen?
Kumaresan Perumal
1
ngif weil einige eckige Materialkomponenten nicht initialisiert werden und nicht richtig funktionieren, wie z. B. mat-paginator. Ich denke, die Verwendung von [versteckt] ist in einigen Fällen die bessere Wahl.
AmirHossein Rezaei
186

Es gibt zwei Möglichkeiten, je nachdem, was Sie erreichen möchten:

  1. Mit der Anweisung hidden können Sie ein Element ein- oder ausblenden

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
  2. Mit der Steueranweisung ngIf können Sie das Element hinzufügen oder entfernen. Dies unterscheidet sich von der versteckten Direktive, da das Element nicht angezeigt / ausgeblendet wird, sondern dem DOM hinzugefügt / daraus entfernt wird. Sie können nicht gespeicherte Daten des Elements verlieren. Dies kann die bessere Wahl für eine Bearbeitungskomponente sein, die abgebrochen wird.

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

Bei einem Änderungsproblem nach 3 Sekunden kann dies auf eine Inkompatibilität mit setTimeout zurückzuführen sein. Haben Sie die Bibliothek angular2-polyfills.js in Ihre Seite aufgenommen?

Gentiane
quelle
5
[hidden]="edited"scheint keine Auswirkungen zu haben ...?
Phil294
5
Wenn Sie Probleme mit versteckt haben, folgen Sie bitte der Antwort von stackoverflow.com/a/35578093/873282 : [hidden] { display: none !important;}in Ihrem globalen CSS.
Koppor
30

Wenn Sie das HTML-Dom-Element nicht entfernen möchten, verwenden Sie * ngIf.

Andernfalls verwenden Sie Folgendes:

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

Damit die untergeordnete Komponente zeigt, dass ich sie verwendet habe *ngif="selectedState == 1"

Stattdessen habe ich verwendet [hidden]="selectedState!=1"

Es hat bei mir funktioniert. Das Laden der untergeordneten Komponente ordnungsgemäß und nach dem Ein- und Ausblenden der untergeordneten Komponente war nach dieser Verwendung nicht undefiniert.

Swapnil Kale
quelle
6

Dies ist ein guter Anwendungsfall für eine Richtlinie. So etwas ist überraschend nützlich.

@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);
  }
}
Aluan Haddad
quelle
Ich mag die Idee, aber dadurch wird das Element vollständig entfernt. Ich habe es geändert, um es auszublenden, damit Sie es wiederverwenden können, aber das versteckt das Element vermutlich nicht aufgrund des ngIfis true. Gibt es eine Möglichkeit, die Variable des Elternteils festzulegen, die dies steuert false?
gelegentlich
Können Sie nicht einfach eine versteckte Klasse oder etwas hinzufügen, anstatt remove aufzurufen? Diese Technik ist ziemlich allgemein.
Aluan Haddad
Ich denke, das Problem liegt ngIfeher darin, ob sich das Element im DOM befindet oder nicht. Was ich möchte, ist Folgendes: <div [hidden]="messages" [removeAfter]=3000>...Wo ich Nachrichten ein- / ausblende, wenn es welche gibt, und Nachrichten nach 3 Sekunden entferne, damit der Benutzer das Feld nicht schließen muss. Ich habe Ihre Anweisung oben hinzugefügt und auf a umgestellt, hide()aber sie wird nicht aufgerufen, wenn die Nachrichten angezeigt werden. Wie kann ich erreichen, dass es bei der Veranstaltung aufgerufen wird? @Output()und EventEmitter?
gelegentlich
4

Wir können dies mit dem folgenden Code-Snippet tun.

Winkelcode:

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

HTML-Vorlage:

  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>
Rejwanul Reja
quelle
3

Je nach Bedarf, *ngIfoder [ngClass]="{hide_element: item.hidden}"wo CSS - Klasse hide_elementist{ display: none; }

*ngIfkann Probleme verursachen, wenn Sie Statusvariablen *ngIfentfernen. In diesen Fällen ist die Verwendung von CSS display: none;erforderlich.

Luke Dupin
quelle
0

@inoabrian Lösung oben hat bei mir funktioniert. Ich stieß auf eine Situation, in der ich meine Seite aktualisierte und mein verstecktes Element auf meiner Seite wieder auftauchte. Folgendes habe ich getan, um das Problem zu beheben.

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

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

Fügen Sie einfach bind (this) in Ihre setTimeout-Funktion ein, damit es funktioniert

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

und in HTML ändern

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

Zu

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