- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有一种情况,我想在单击按钮时清除“viewContainer”,但它显示错误
ERROR TypeError: Cannot read property 'viewContainer' of undefined
请检查附加代码以便更好地理解。
注意:在我的例子中,您会看到,我在 document.body
上添加了点击事件,并将指令名称保留为 [ngIf](我知道这一点不是剧透)。
此外,我尝试在我的点击监听器中设置 this.ngIf = false;
,但这也产生了同样的错误。
"ERROR TypeError: Cannot set property 'ngIf' of undefined"
提前致谢。
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 { }
最佳答案
您只是无法在 clearView
中访问 this
使用这个:
this.renderer.listen(document.body, 'click', (event) => {
// Do something with 'event'
this.viewContainer.clear();
})
您没有将此引用传递给那个 clearView
函数
或者像这样将容器引用传递给 clearView
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;
}
哦,是的,最重要的是,箭头函数可以在不改变任何东西的情况下工作,抱歉我之前没有考虑过这个:)
An arrow function does not create its own this context, so this has its original meaning from the enclosing context.
clearView = (event: any) => {
this.viewContainer.clear();
//this.ngIf = false;
}
关于angular - 当我想明确清除它时无法读取未定义的属性 'viewContainerRef',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955825/
假设我们有以下内容: @Directive({ selector: "[appSome]" }) export class SomeDirective { public constructor
假设我们有以下内容: @Directive({ selector: "[appSome]" }) export class SomeDirective { public constructor
有一种情况,我想在单击按钮时清除“viewContainer”,但它显示错误 ERROR TypeError: Cannot read property 'viewContainer' of unde
只是尝试阐明 ViewContainerRef.createComponent 中索引参数的含义: createComponent( componentFactory: ComponentFa
我想在 Angular 4 中创建嵌套组件 这是选择器组件 import {InputComponent} from './input/input.component' import {BlockCo
我正在尝试显示一个类似于(不完全) Angular 文档中示例的动态组件。 我有一个带有 viewContainerRef 的动态指令 @Directive({ selector: '[dyna
我正在创建一个“组件工厂”来帮助我动态创建组件。该工厂用于创建类似的组件; PopOvers、Modals、Overlays 等 它有一个 attach 方法来创建组件: attach(compone
升级到 Angular 7 后,我得到 parentInjector is deprecated: No replacement在我的代码中。由于这显然已被弃用,为什么没有可用的更新,或者 Angul
给定用于 Dynamic Component Loading 的指令与 ViewContainerRef注入(inject): import { Directive, ViewContainerRef
所以我目前正在尝试创建嵌套评论,并且我目前正在引入一个动态表单组件,以便人们可以回复评论。当只有 parent 和 child 时,它效果很好,但如果有 sibling ,它会选择第一个。例如, --
所以我目前正在尝试创建嵌套评论,并且我目前正在引入一个动态表单组件,以便人们可以回复评论。当只有 parent 和 child 时,它效果很好,但如果有 sibling ,它会选择第一个。例如, --
什么更好?使用 ngFor 或 ViewContainerRef 动态创建组件?有什么区别? 例如,如果我有一个创建新元素的按钮,每次按下它都会生成一个新组件。 1) 第一个选项如下 items: n
我有一个组件: @Component({ selector: 'vcrdi', template: ` ViewContainerRef DI `, })
我使用 viewContainerRef.createComponent 将动态组件加载到根组件中(......),但实际上它附加了错误的位置, 我的代码: -----app.compoment.ts
当我使用 ViewContainerRef 创建组件并将实例分配给负责创建子组件的父组件的属性时,是否需要将此属性设置为 null 如果我想释放内存,在调用 ViewContainerRef.clea
有没有办法从动态创建的组件中获取 ViewContainerRef?我动态创建的组件内部有一个 ngContent 元素,我想在动态创建后填充它。 export class Example { @
我是这样动态添加组件的: export class CustomersOverviewComponent implements OnInit, OnDestroy { @ViewChild(Pan
嘿,我现在正在逐步学习 Angular 2,并且我已经构建了一个名为 except 的结构自定义指令。除非行为与 ngIf act 相同,否则如果我的条件为真,则将元素附加到 dom,否则将其分离。这
我正在尝试获取 ViewContainerRef 中动态创建的组件的 index 我需要获取索引,这样我也可以销毁组件。 代码如下 @ViewChild('dynamicInsert', { read
@Component({ selector: 'my-cmp', template: ` ` }) export class MyCmp { @ViewChild('target',
我是一名优秀的程序员,十分优秀!