[Angular] Step-By-Step Implementation of a Structural Directive - Learn ViewContainerRef
For example we have two buttons:
When we click nether one of those tow button, the modal should show up:
We will use structure directive to do that.
So create a new directive 'auModalOpenOnClick':
import {Directive, TemplateRef, ViewContainerRef} from '@angular/core'; @Directive({
selector: '[auModalOpenOnClick]'
})
export class AuModalOpenOnClickDirective { constructor(
private template: TemplateRef<any>,
private viewContainer: ViewContainerRef
) { }
}
A stucture need to use 'TemplateRef' and 'ViewContainerRef'. You can simply think that templateRef refer to the html you are going to show/hide. ViewContainerRef refers to the container that wrap the template/compoent, normally it should be <ng-template>.
HTML:
<ng-template [auModalOpenOnClick]="[loginButton, signUpButton]">
<au-modal class="auth-modal">
<!-- modal content goes here-->
</au-modal>
</ng-template> <div class="modal-buttons"> <button #loginButton>Login</button> <button #signUpButton>Sign Up</button> </div>
So the way we use the directive is that it takes a input which can be array of template ref or just a single templateRef.
We are going to check in the directive, if the passed in templateRef(s) are clicked or not, if it is click, we are going to create a embbed view based on the template (au-modal) we got.
directive:
import {Directive, Input, TemplateRef, ViewContainerRef} from '@angular/core'; @Directive({
selector: '[auModalOpenOnClick]'
})
export class AuModalOpenOnClickDirective { @Input()
set auModalOpenOnClick (els) { let elements: HTMLBaseElement[]; if(Array.isArray(els)) {
elements = els;
} else {
elements = [els];
} elements.forEach(el => {
el.addEventListener('click', () => {
this.viewContainer.clear();
this.viewContainer.createEmbeddedView(this.template);
});
});
} constructor(
private template: TemplateRef<any>,
private viewContainer: ViewContainerRef
) { } }
And also worth to mention that:
<ng-template [auModalOpenOnClick]="[loginButton, signUpButton]">
<au-modal class="auth-modal">
<!-- modal body-->
</au-modal>
</ng-template>
the same as:
<au-modal class="auth-modal"*auModalOpenOnClick="[loginButton, signUpButton]">
<!-- modal body-->
</au-modal>
最新文章
- iOS下Audio自动播放(Autoplay)音乐
- java获取日期
- What is the difference between differed processing mode and interactive mode?
- opennebula 创建模板【配置集群、配置VNC、配置RAW、配置SSH】
- [ Database ] [ Sybase ] [ SQLServer ] sybase 與SQL Server的界接方式
- 《C#并行编程高级教程》第7章 VS2010任务调试 笔记
- 【原】Arrays.binarySearch() 的用法
- 线程池ThreadPoolExecutor使用简介
- axure RP Pro7.0加载日历控件的步骤
- \s+(?<;request_time>;\d+(?:\.\d+)?)\s+ 解释
- 【转】Storm并行度详解
- js原生拓展网址——mozilla开发者
- 剑指offer(一)
- U813.0操作员功能权限和数据权限的设置
- AET 本征半导体
- 关于使用IsapiRewrite重写,重定向的语句
- requests(二): json请求中固定键名顺序&;消除键和值之间的空格
- Android 演示 DownloadManager&mdash;&mdash;Android 下载 apk 包并安装
- C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
- 1048 Find Coins (25 分)