zoukankan      html  css  js  c++  java
  • [Angular] Step-By-Step Implementation of a Structural Directive

    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>    
  • 相关阅读:
    【LeetCode】46. 全排列(回溯)
    [P2894][USACO08FEB] 酒店Hotel (线段树+懒标记下传)
    [P2680][NOIP2015T6] 运输计划 (LCA+树上差分+二分)
    静态主席树学习笔记
    [P1941][NOIP2014T3] 飞扬的小鸟 (0/1背包+完全背包)
    [P1084][NOIP2012T6] 疫情控制 (二分+贪心+LCA)
    [P3959][NOIP2017T5] 宝藏 (状压DP+DFS)
    [P2679][NOIP2015T5] 子串 (DP+滚动数组)
    [P1314][NOIP2011T5] 聪明的质检员 (二分+前缀和)
    [P1966][NOIP2013T2] 火柴排队 (求逆序对+归并排序/树状数组)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7097028.html
Copyright © 2011-2022 走看看