【问题标题】:Get angular-directive-instance even though it´s not rendered获取角度指令实例,即使它没有被渲染
【发布时间】:2019-04-29 00:24:21
【问题描述】:

我正在尝试获取一个角度指令实例,即使它尚未呈现。

例如,我有一个 app-component 和 baz-directive。即使没有显示/呈现给dom,我也想获取指令实例。当然,我可以通过输入 var 来控制功能,但在我的情况下,访问实例并调用一些函数会更好/更容易。因此,它的行为应该类似于 NgIf*,不仅通过输入 var,而且通过实例函数调用。

所以我的问题是,即使它没有被渲染,我如何获得实例,或者是否有任何其他/更好的方法来处理这种情况?

import {Component, Directive, OnInit, TemplateRef, ViewChild, ViewContainerRef} from "@angular/core";

@Directive({selector: '[baz]'})
export class BazDirective
{
    constructor(protected view: ViewContainerRef, protected template: TemplateRef<any>)
    {
    }

    renderNow()
    {
        this.view.createEmbeddedView(this.template);
    }
}

@Component({
    selector: "app-root", templateUrl: "./app.component.html"
})
export class AppComponent implements OnInit
{
    @ViewChild(BazDirective) bar: BazDirective


    constructor()
    {
    }

    ngOnInit(): void
    {
        this.bar.renderNow();
    }
}

&lt;div #bar *baz&gt;foo&lt;/div&gt;

【问题讨论】:

  • 未显示 = 不可访问。
  • 这就是问题所在,因为该指令存在,否则我猜它无法对输入 var 更改做出反应。
  • 组件存在,指令不存在。它已从 dom 中删除,您无法访问它。

标签: angular angular-directive angular-components


【解决方案1】:

是的,这是可能的,这取决于您所说的未渲染是什么意思。因为不可见不代表不渲染。

使用结构指令,就像在您的示例中一样,您可以访问您的指令。这是一个活生生的例子:Stackblitz。 如果你的指令真的没有被渲染(例如包装在 *ngIf 中),情况就不是这样了。

在您的示例中,您不应在 html 元素上使用模板变量 #bar,因为您使用 @ViewChild() 定位 BazDirective。

希望对你有帮助!

【讨论】:

  • 我的错误。比较你和我的版本,我注意到我的版本不起作用,因为我没有在模块声明中包含指令。所以一个愚蠢的错误,没有特殊的角度行为。谢谢!
  • 是的,#bar var 是一些测试的剩余部分。
  • 没问题!太好了,你解决了你的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2015-10-18
  • 2014-04-11
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多