【问题标题】:Angular parent-child interactionAngular 亲子交互
【发布时间】:2018-08-09 07:01:00
【问题描述】:

我很抱歉问这个问题,因为之前有人问过它的变体,但我被困住了,无法找到解决这种情况的方法,也找不到 Angular Material 文档有帮助。

我正在使用一个 Angular Material 按钮,并尝试从我的应用组件中调用它。

这是我的应用组件代码:

import { Component, ViewChild, OnInit, AfterViewInit } from '@angular/core';
import { ButtonComponent } from './components/button/button.component';
import { MatTooltip} from '@angular/material'


    @Component({

  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'replace-services-project';

  @ViewChild(ButtonComponent) buttonComponent:ButtonComponent

  onClick(text:string){
      this.buttonComponent.onClick(text);
  }
 }

这是我的应用组件模板

<div style="text-align:center">

    <div class="button-row">

        <button  mat-raised-button matTooltip="Info about the action"  color="primary" (click)="onClick('First Button')">
            First Button
        </button>
    </div>
</div>

这是我的按钮组件:

import { Component, OnInit, AfterViewInit } from '@angular/core';

@Component({
  selector: 'app-button',
  templateUrl: './button.component.html',
  styleUrls: ['./button.component.css']
})
export class ButtonComponent {


  onClick=(text:string)=>{
    console.log(text);
  }

  constructor() { }

  }

当我到达 this.buttonComponent.onClick(text); 行时,控制台中出现运行时错误:ERROR TypeError: Cannot read property 'onClick' of undefined。

【问题讨论】:

  • 好吧,您的模板中没有任何 。那么@ViewChild(ButtonComponent) 怎么能找到按钮组件呢?
  • @kickinchicken 为什么要写这样的方法:onClick=(text:string)=>{...} 而不是 onClick(text: string) {...} 有什么好处吗?
  • @JBNizet - 材料组件的文档说这是它的工作方式。
  • @josip:我最初尝试过,但也无法使用该方法。
  • 不,他们没有。如果组件选择器是 app-button,如果模板中有 元素,它将被创建。这是基本的 Angular 东西。如果您认为角度材料另有说明,请指向特定的文档,以便我们向您解释。

标签: angular angular-material


【解决方案1】:

Angular 将“按钮”视为常规 html 按钮,而不是您的自定义组件。你的选择器是

selector: 'app-button',

尝试使用

<app-button></app-button>

改为。

【讨论】:

  • 谢谢@ramden。材料组件不是那样工作的。它们基本上扩展了普通组件。抱歉耽搁了。
  • 在材质和按钮的情况下,材质只是一个指令/管道,它改变了按钮的一些属性(更像是一个装饰器),但它们不会做任何改变 onClick 的事情。您所描述的问题是通过使用您定义 onClick 自定义方法的组件选择器来解决的。您也可以尝试将自定义方法放在 AppComponent 上,它会起作用,因为按钮在 AppComponent 模板中,但是您创建了一个自定义组件并且 Angular 无法知道那里找到您的方法(在什么组件)
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2020-09-15
  • 2017-08-26
  • 1970-01-01
  • 2020-09-23
  • 2019-05-05
相关资源
最近更新 更多