当前位置: 首页 > 知识库问答 >
问题:

*NGIF中的@ViewChild

戚兴邦
2023-03-14

在模板中的对应元素显示后,获取@viewchild的最优雅的方法是什么?

下面是一个例子。还提供柱塞。

component.template.html:

<div id="layout" *ngIf="display">
  <div #contentPlaceholder></div>
</div>

component.component.ts:

export class AppComponent {

    display = false;
    @ViewChild('contentPlaceholder', { read: ViewContainerRef }) viewContainerRef;

    show() {
        this.display = true;
        console.log(this.viewContainerRef); // undefined
        setTimeout(() => {
            console.log(this.viewContainerRef); // OK
        }, 1);
    }
}

我有一个默认情况下隐藏其内容的组件。当有人调用show()方法时,它将变得可见。但是,在Angular 2更改检测完成之前,我不能引用viewcontainerref。我通常将所有必需的操作包装到setTimeout(()=>{},1)中,如上图所示。有没有更正确的方法?

我知道有一个带有ngAfterViewChecked的选项,但是它导致了太多无用的调用。

共有1个答案

廉学潞
2023-03-14

为ViewChild使用setter:

 private contentPlaceholder: ElementRef;

 @ViewChild('contentPlaceholder') set content(content: ElementRef) {
    if(content) { // initially setter gets called with undefined
        this.contentPlaceholder = content;
    }
 }

一旦*ngif变为true时,就会使用元素引用调用setter。

注意,对于Angular 8,您必须确保设置{static:false},这是其他Angular版本的默认设置:

 @ViewChild('contentPlaceholder', { static: false })

注意:如果contentPlaceholder是一个组件,您可以将ElementRef更改为您的组件类:

  private contentPlaceholder: MyCustomComponent;

  @ViewChild('contentPlaceholder') set content(content: MyCustomComponent) {
     if(content) { // initially setter gets called with undefined
          this.contentPlaceholder = content;
     }
  }
 类似资料:
  • 我想检查实际元素是否有值。 例如,我想检查巧克力是黑色还是白色。根据这个,我想显示正确的文本。 如何修复代码,使其正常工作?

  • 这两个语法都是完全有效的,对于语法1,您可以像这里描述的那样更进一步,但是对于使用其中一个和另一个有什么性能/最佳实践建议吗?

  • 想改进这个问题吗 通过编辑此帖子,更新问题,以便用事实和引用来回答。 考虑以下代码示例: 实现相同功能的另一种方法是: 想知道这两种方式应该用哪一种的具体原因,为什么?

  • 在我的 Angular 5 应用程序中,我正在循环创建 元素: 但是我只想在满足某些条件的情况下显示该行。我知道我不能一起使用和,但我不知道如何绕过这个问题。 我看到一篇文章说使用构造在tr中添加一个模板,但这似乎不再是有效的语法。如果我这样尝试: 然后我得到运行时错误。 应用组件。html:14错误错误:StaticInjectorError(AppModule)[NgIf-

  • 问题内容: 和之间有什么实际区别?这两个指令都操作DOM,但更为冗长。除非在这种情况下需要非常大的东西,否则通常使用这种情况吗? 有一种情况,并不能直接替代品?还是它们唯一的实际区别在于语法? 问题答案: 我相信,MicheleTilley完全正确,特别是指出/的对比。还有另外一个需要注意的区别:将 原位 分离并重新附加元素。但是具有外部包含元素,您可以在其上声明主要指令及其条件:。该外部元素中的