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>

最新文章

  1. iOS下Audio自动播放(Autoplay)音乐
  2. java获取日期
  3. What is the difference between differed processing mode and interactive mode?
  4. opennebula 创建模板【配置集群、配置VNC、配置RAW、配置SSH】
  5. [ Database ] [ Sybase ] [ SQLServer ] sybase 與SQL Server的界接方式
  6. 《C#并行编程高级教程》第7章 VS2010任务调试 笔记
  7. 【原】Arrays.binarySearch() 的用法
  8. 线程池ThreadPoolExecutor使用简介
  9. axure RP Pro7.0加载日历控件的步骤
  10. \s+(?&lt;request_time&gt;\d+(?:\.\d+)?)\s+ 解释
  11. 【转】Storm并行度详解
  12. js原生拓展网址——mozilla开发者
  13. 剑指offer(一)
  14. U813.0操作员功能权限和数据权限的设置
  15. AET 本征半导体
  16. 关于使用IsapiRewrite重写,重定向的语句
  17. requests(二): json请求中固定键名顺序&amp;消除键和值之间的空格
  18. Android 演示 DownloadManager&mdash;&mdash;Android 下载 apk 包并安装
  19. C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
  20. 1048 Find Coins (25 分)

热门文章

  1. 60.浅谈nodejs中的Crypto模块
  2. sql server 怎样用select语句调用自定义表值函数
  3. 洛谷 P2242 公路维修问题
  4. swift 一疑问:reduce
  5. 如何修复和检测Windows系统漏洞
  6. Echarts Y轴min显示奇葩问题(做此记录)
  7. JS/CSS 各种操作信息提示效果
  8. slice深拷贝数组
  9. CentOS不能进入登录界面
  10. POJ 3045 Cow Acrobats (最大化最小值)