首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何最有效地提取ViewContainerRef和ComponentRef?

如何最有效地提取ViewContainerRef和ComponentRef?
EN

Stack Overflow用户
提问于 2017-07-12 17:54:39
回答 1查看 4K关注 0票数 3

我使用棱角材质mdSidenav,并希望以编程方式打开它并插入自定义组件.

我使用@ViewChild('varName')提取componentInstance,使用@ViewChild('varName', {read: ViewContainerRef})提取将放置内容的容器。

所以,我的问题是-它是否可能只是1 @ViewChild,并从提取的参考得到其他信息。

第二个问题-哪些值允许读取属性?元素参考/视图容器参考/.?

更新:

我发现,ViewContainerRef of mdSidenav不正确的容器为我的组件。如何将component.hostView放在mdSidenav hostView中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-12 17:57:18

是否可能只需1 @ViewChild并从提取的参考中获取其他信息。

不,不能为一个属性指定多个读取类型。例如,您可以在html中指定以下内容:

代码语言:javascript
复制
<ng-template mydir #vc></ng-template>

现在它可以被理解为ElementRefTemplateRefViewContainerRefMyDirectiveInstance。您不能指定多个read类型,因为角不知道该节点返回什么。必须为每个查询属性指定单个read类型。一般来说,你不能从另一种类型中得到一种。虽然两者都

哪些值允许读取属性?元素参考/视图容器参考/.?

您可以通过查询获得以下类型:

  • ElementRef
  • TemplateRef
  • ViewContainerRef
  • 提供者(组件/指令实例)

从这个源代码可以看出:

代码语言:javascript
复制
export function getQueryValue(
    view: ViewData, nodeDef: NodeDef, queryValueType: QueryValueType): any {
  if (queryValueType != null) {
    // a match
    let value: any;
    switch (queryValueType) {
      case QueryValueType.RenderElement:
        value = asElementData(view, nodeDef.index).renderElement;
        break;
      case QueryValueType.ElementRef:
        value = new ElementRef(asElementData(view, nodeDef.index).renderElement);
        break;
      case QueryValueType.TemplateRef:
        value = asElementData(view, nodeDef.index).template;
        break;
      case QueryValueType.ViewContainerRef:
        value = asElementData(view, nodeDef.index).viewContainer;
        break;
      case QueryValueType.Provider:
        value = asProviderData(view, nodeDef.index).instance;
        break;
    }
    return value;
  }
}

RenderElement指向与视图节点关联的原生DOM元素,但它在内部使用,不能使用组件中的查询访问AFAIK。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45064576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档