Ich habe ein Problem mit dem Verbergen und Anzeigen eines Elements, das von einer booleschen Variablen in Angular 2 abhängt.
dies ist der Code, den das div anzeigen 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 wird "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 saveTodos-Funktion gestartet wird, wird das Element angezeigt. Nach 3 Sekunden wird das Element jedoch nicht ausgeblendet, auch wenn die Variable wieder "false" ist. Warum?
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 im Timeout-Callback befinden.
fügen Sie also das .bind (this) hinzu, wie ich es oben hinzugefügt habe
Q: edit ist eine globale Variable. Wie würdest du in einer * ngFor-Schleife vorgehen? - Blauhirn
A: Ich würde dem Objekt, über das ich iteriere, Bearbeiten 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);
}
}
Es gibt zwei Optionen, je nachdem, was Sie erreichen möchten:
Sie können die hidden Direktive verwenden, um ein Element ein- oder auszublenden
<div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
<strong>List Saved!</strong> Your changes has been saved.
</div>
Sie können die Steueranweisung ngIf verwenden, um das Element hinzuzufügen oder zu entfernen. Dies unterscheidet sich von der ausgeblendeten Direktive, da das Element nicht angezeigt bzw. ausgeblendet wird, es jedoch aus dem DOM hinzugefügt/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 es an Inkompatibilität mit setTimeout liegen. Haben Sie die Bibliothek angle2-polyfills.js in Ihre Seite aufgenommen?
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>
Zur Anzeige der untergeordneten Komponente verwendete ich *ngif="selectedState == 1"
Stattdessen habe ich [hidden]="selectedState!=1"
verwendet.
Es funktionierte für mich .. das Laden der untergeordneten Komponente ordnungsgemäß und nachdem die untergeordnete Komponente ein- und ausgeblendet wurde, war sie nach dieser Verwendung nicht undefiniert.
Dies ist ein guter Anwendungsfall für eine Richtlinie. So etwas ist überraschend nützlich.
@Directive({selector: '[removeAfter]'}) export class RemoveAfter {
@Input() removeAfter: number;
constructor(readonly element: ElementRef) { }
ngOnInit() {
setTimeout(() => {
this.element.nativeElement.remove();
}, this.removeAfter);
}
}
Abhängig von Ihren Anforderungen *ngIf
oder [ngClass]="{hide_element: item.hidden}"
, wobei die CSS-Klasse hide_element
{ display: none; }
ist.
*ngIf
kann Probleme verursachen, wenn Sie Statusvariablen ändern. *ngIf
wird entfernt. In diesen Fällen ist die Verwendung von CSS display: none;
erforderlich.
Wir können dies tun, indem Sie den folgenden Code-Ausschnitt verwenden.
Winkelcode:
export class AppComponent {
toggoleShowHide:string ="visible";
}
HTML-Vorlage:
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>
@inoabrian Lösung oben arbeitete für mich. Ich bin in eine Situation geraten, in der ich meine Seite auffrischen würde und mein verborgenes Element auf meiner Seite wieder angezeigt würde. Hier ist, was ich getan habe, um das Problem zu lösen.
export class FooterComponent implements OnInit {
public showJoinTodayBtn: boolean = null;
ngOnInit() {
if (condition is true) {
this.showJoinTodayBtn = true;
} else {
this.showJoinTodayBtn = false;
}
}
Fügen Sie einfach bind (this) in Ihre setTimeout-Funktion ein
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>