理解Angular2中的ViewContainerRef

栏目: JavaScript · 发布时间: 5年前

内容简介:原文链接:作者:译者:

原文链接: https://netbasal.com/angular-...

作者: Netanel Basal

译者: 而井

理解Angular2中的ViewContainerRef

译者注:虽然文章标题写的是Angular2,但其实泛指的是Angular2+,读者可以将其运用到最新的Angular版本中。

如果你曾经需要用编程的方式来插入新的组件或模版,你可能已经用过了 ViewContainerRef 服务了。

在阅读了(许多)文章和问题后,我发现了许多(人)对于 ViewContainerRef 的疑惑,所以让我试着向你解释什么是 ViewContainerRef

注意:本文不是关于如何用编程的方式来创建组件的(文章)。(译者注:只是为了阐述什么是 ViewContainerRef

让我们回归到纯JavaScript上来开始(教程)。根据下面的标记,你的任务是添加一个新段落来作为当前(节点)的一个兄弟(节点)。

<p class=”one”>Element one</p>

为了简化(操作),让我们使用JQuery:

$('<p>Element two</p>').insertAfter('.one');

当你需要添加新的DOM元素(即:组件、模版)时,你需要一个可以插入这个元素的位置。

Angular也没有什么黑魔法。它也只是JavaScript。如果你想插入新的组件或模版,你需要告诉Angular,哪里去放置这个元素。

所以ViewContainerRef就是:

一个你可以将新的组件作为其兄弟(节点)的DOM元素(容器)。

用依赖注入来获取ViewContainerRef

@Component({
  selector: 'vcr',
  template: `
    <template #tpl>
      <h1>ViewContainerRef</h1>
    </template>
  `,
})
export class VcrComponent {
  @ViewChild('tpl') tpl;
  constructor(private _vcr: ViewContainerRef) {
  }
  
  ngAfterViewInit() {
    this._vcr.createEmbeddedView(this.tpl);
  }
}

@Component({
  selector: 'my-app',
  template: `
      <vcr></vcr>
  `,
})
export class App {

}

我们在这个组件中注入了服务。在这个样例中,容器将指向你的 宿主 元素(vcr 元素),并且模版将作为vcr元素的 兄弟 (节点)被插入。

理解Angular2中的ViewContainerRef

用ViewChild来获取ViewContainerRef

@Component({
  selector: 'vcr',
  template: `
    <template #tpl>
      <h1>ViewContainerRef</h1>
    </template>
    <div>Some element</div>
    <div #container></div>
  
  `,
})
export class VcrComponent {
  @ViewChild('container', { read: ViewContainerRef }) _vcr;
  @ViewChild('tpl') tpl;

  ngAfterViewInit() {
    this._vcr.createEmbeddedView(this.tpl);
  }
}

@Component({
  selector: 'my-app',
  template: `
    <div>
      <vcr></vcr>
    </div>
  `,
})
export class App {

}

我们可以使用 ViewChild 装饰器来收集任何我们视图上的元素,并将其当作 ViewContainerRef

在这个例子中,容器元素就是 div 元素,模版将作为这个 div 元素的兄弟(节点)被插入。

理解Angular2中的ViewContainerRef

你可以将 ViewContainerRef 用日志输出,来查看它的元素是什么:

理解Angular2中的ViewContainerRef

你可以在 这里 试玩这些代码。

好了本文到此结束。

译者附

虽然作者已经说得很透彻了,但是由于动态插入组件、模版有很多种排列组合,我(译者)做了一些样例代码来辅助你理解,目前代码已经上传到GitHub上了,地址是: https://github.com/RIO-LI/ang...

这个参考项目目前包含6的目录,每一个都是单独的Angular项目,每一个目录具体演示内容如下:

component-insert-into-component-viewcontainer : 用来演示以组件作为视图容器ViewContainerRef,将另外一个组件插入视图容器的效果。

component-insert-into-dom-viewcontainer : 用来演示以DOM元素为视图容器ViewContainerRef,将一个组件插入视图容器的效果。

component-insert-into-self-viewcontainer : 用来演示以组件自身作为视图容器ViewContainerRef,将组件中的模版插入视图容器的效果。

ngtemplate-insert-into-component-viewcontainer : 用来演示以一个组件作为视图容器ViewContainerRef,将一个 <ng-template> 插入视图容器的效果。

ngtemplate-insert-into-dom-viewcontainer : 用来演示以一个DOM元素为视图容器ViewContainerRef,将一个 <ng-template> 插入视图容器的效果。

ngtemplate-insert-into-ngcontainer-viewcontainer :用来演示以一个<ng-container>元素为视图容器ViewContainerRef,将一个 <ng-template> 插入视图容器的效果。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

海星模式

海星模式

奥瑞·布莱福曼、罗德·贝克斯特朗 / 李江波 / 中信出版社 / 2008-1 / 36.00元

如果砍掉一只蜘蛛的脑袋,毫无疑问它会死掉;但是砍掉海星的一条手臂,它却会长出一只新的来,就连那只砍掉的手臂也会长成一个完整的新海星。传统意义上自上而下的组织模式就像蜘蛛,然而现在正在改变着企业和世界面貌的却是海星型组织。 维基百科、craigslist和Skype的成功下面隐藏着什么样的力量?易趣公司和通用电气公司与废奴和女权运动又有什么共同之处?到底是什么样的重大选择使得通用汽车公司与丰田......一起来看看 《海星模式》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具