angular - Kan inte läsa egenskapen 'viewContainerRef' av undefined när jag vill rensa den explicit
Det finns ett scenario där jag vill rensa 'viewContainer' vid knapptryckning men det visar fel
FEL TypeError: Kan inte läsa egenskapen 'viewContainer' av odefinierad
Vänligen kontrollera bifogad kod för bättre förståelse.
Obs: I mitt fall kommer du att se att jag har lagt till ett klickhändelse på document.body och även behållit direktivnamnet som [ngIf](Jag vet att detta inte är spoiligaren).
Jag försökte också sätta this.ngIf=false; i min klicklyssnare, men det genererar samma fel.
"FEL TypeError: Kan inte sätta egenskapen 'ngIf' på undefined"
Tack i förväg.
app.component.ts
import { Component, TemplateRef, Directive, ViewContainerRef, Input, ElementRef, Renderer, ViewChild, ViewChildren, HostListener } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<div *ngIf="val">
Hello cpIf Directive.
</div>
`,
styles: [`h1 { font-family: Lato; }`]
})
export class AppComponent {
val: boolean = true;
}
@Directive({
selector: '[ngIf]'
})
export class CpIfDirective {
constructor(private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef,
private renderer: Renderer) {
//this.viewContainer.createEmbeddedView(this.templateRef);
}
ngAfterViewInit() {
//this.viewContainer.createEmbeddedView(this.templateRef);
this.renderer.listen(document.body, 'click', this.clearView);
}
@Input() set ngIf(condition: boolean) {
if (condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
clearView(event: any) {
this.viewContainer.clear();
//this.ngIf = false;
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent, CpIfDirective } from './hello.component';
@NgModule({
imports: [BrowserModule, FormsModule, ReactiveFormsModule],
declarations: [AppComponent, HelloComponent, CpIfDirective],
bootstrap: [AppComponent]
})
export class AppModule { }
Svar #1
Du kan helt enkelt inte komma åt this inuti clearView
använd detta:
this.renderer.listen(document.body, 'click', (event) => {
// Do something with 'event'
this.viewContainer.clear();
})
Du skickar inte denna referens till den clearView-funktionen
Demo
eller skicka behållarreferensen till clearView så här
this.renderer.listen(document.body, 'click', (event) => {
// Do something with 'event'
this.clearView(event, this.viewContainer)
})
clearView(event: any, element) {
element.clear();
//this.ngIf = false;
}
Åh ja, viktigast av allt, pilfunktioner skulle fungera utan att ändra något, förlåt jag tänkte inte på detta tidigare :)
En pilfunktion skapar inte sin egen this-kontext, så this behåller sin ursprungliga betydelse från den omgivande kontexten.
clearView = (event: any) => {
this.viewContainer.clear();
//this.ngIf = false;
}
Ref
