理解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> 插入视图容器的效果。


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

查看所有标签

猜你喜欢:

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

Django 1.0 Template Development

Django 1.0 Template Development

Scott Newman / Packt / 2008 / 24.99

Django is a high-level Python web application framework designed to support the rapid development of dynamic websites, web applications, and web services. Getting the most out of its template system a......一起来看看 《Django 1.0 Template Development》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器