1. import { Component, Directive, Input } from "@angular/core";
    2. @Component({
    3. selector: "app-root",
    4. template: `
    5. <a Demo [name]="'a'" #A="Demo" (click)="show(A)"></a>
    6. <b #B="BComponent" (click)="show(B)"></b>
    7. `,
    8. styleUrls: ["./app.component.css"]
    9. })
    10. export class AppComponent {
    11. title = "AppComponent";
    12. show(value) {
    13. console.log(value);
    14. }
    15. ngOnInit() {
    16. console.log("init");
    17. }
    18. }
    19. @Directive({
    20. selector: "[Demo]",
    21. exportAs: `Demo`
    22. })
    23. export class DemoDirective {
    24. @Input() name: string;
    25. }
    26. @Component({
    27. selector: "a",
    28. template: ` <div>这是{{ title }}</div> `,
    29. styleUrls: ["./app.component.css"],
    30. exportAs: "AComponent"
    31. })
    32. export class AComponent {
    33. title = "AComponent";
    34. }
    35. abstract class abstractB {
    36. address: string = "地址";
    37. }
    38. @Component({
    39. selector: "b",
    40. template: ` <div>这是{{ title }}</div> `,
    41. styleUrls: ["./app.component.css"],
    42. exportAs: `BComponent`
    43. })
    44. export class BComponent extends abstractB {
    45. title = "BComponent";
    46. @Input() age: number;
    47. constructor() {
    48. super();
    49. }
    50. }
    1. import { Component, Directive, Input } from "@angular/core";
    2. @Component({
    3. selector: "app-root",
    4. // #A="Demo" 这里算是在当前节点处read指令实例
    5. // 其实这里有很多实例,比如ElementRef(在模板里无法使用,可以在ViewChild中的read参数中使用)
    6. // AComponent
    7. // Demo指令
    8. // 可以在模板里面指定读出哪个实例,然后赋值
    9. template: ` <a Demo [name]="'a'" #A="Demo" (click)="show(A)"></a> `,
    10. styleUrls: ["./app.component.css"]
    11. })
    12. export class AppComponent {
    13. title = "AppComponent";
    14. show(value) {
    15. console.log(value);
    16. }
    17. ngOnInit() {
    18. console.log("init");
    19. }
    20. }
    21. @Directive({
    22. selector: "[Demo]",
    23. exportAs: `Demo`
    24. })
    25. export class DemoDirective {
    26. @Input() name: string;
    27. }
    28. @Component({
    29. selector: "a",
    30. template: ` <div>这是{{ title }}</div> `,
    31. styleUrls: ["./app.component.css"],
    32. exportAs: "AComponent"
    33. })
    34. export class AComponent {
    35. title = "AComponent";
    36. }
    37. abstract class abstractB {
    38. address: string = "地址";
    39. }
    40. @Component({
    41. selector: "b",
    42. template: ` <div>这是{{ title }}</div> `,
    43. styleUrls: ["./app.component.css"],
    44. exportAs: `BComponent`
    45. })
    46. export class BComponent extends abstractB {
    47. title = "BComponent";
    48. @Input() age: number;
    49. constructor() {
    50. super();
    51. }
    52. }
    1. import { Component, Directive, Input } from "@angular/core";
    2. @Component({
    3. selector: "app-root",
    4. // #A="Demo" 这里算是在当前节点处read指令实例
    5. // 其实这里有很多实例,比如ElementRef(在模板里无法使用,可以在ViewChild中的read参数中使用)
    6. // AComponent
    7. // Demo指令
    8. // 可以在模板里面指定读出哪个实例,然后赋值
    9. template: `
    10. <a
    11. Demo
    12. [name]="'a'"
    13. [friend]="{ name: '小明', address: '地址' }"
    14. #A="Demo"
    15. #AA
    16. (click)="show(A, AA)"
    17. ></a>
    18. `,
    19. styleUrls: ["./app.component.css"]
    20. })
    21. export class AppComponent {
    22. title = "AppComponent";
    23. show(value, value1) {
    24. console.log(value, value1);
    25. }
    26. ngOnInit() {
    27. console.log("init");
    28. }
    29. }
    30. class Friend {
    31. name: string;
    32. age: number;
    33. address: string;
    34. constructor(option) {
    35. this.name = "朋友" + option.name;
    36. this.age = option.age ? option.age : 18;
    37. this.address = option.address;
    38. }
    39. }
    40. @Directive({
    41. selector: "[Demo]",
    42. exportAs: `Demo`
    43. })
    44. export class DemoDirective {
    45. @Input() name: string;
    46. }
    47. @Component({
    48. selector: "a",
    49. template: ` <div>这是{{ title }}</div> `,
    50. styleUrls: ["./app.component.css"],
    51. exportAs: "AComponent"
    52. })
    53. export class AComponent {
    54. title = "AComponent";
    55. @Input() friend: Friend;
    56. ngOnInit() {
    57. this.friend = new Friend(this.friend);
    58. }
    59. }
    60. abstract class abstractB {
    61. address: string = "地址";
    62. }
    63. @Component({
    64. selector: "b",
    65. template: ` <div>这是{{ title }}</div> `,
    66. styleUrls: ["./app.component.css"],
    67. exportAs: `BComponent`
    68. })
    69. export class BComponent extends abstractB {
    70. title = "BComponent";
    71. @Input() age: number;
    72. constructor() {
    73. super();
    74. }
    75. }

    与之等价写法

    1. @ViewChild('component', { read: ElementRef /* 组件、指令都可以在这里指定读取哪个实例 */ }) com: ElementRef;

    https://codesandbox.io/embed/quizzical-euler-qqyw9i?fontsize=14&hidenavigation=1&theme=dark
    参考
    https://juejin.cn/post/6956466729891561503