javascript - 从另一个组件调用组件函数 — 出现 "Cannot read property"错误

标签 javascript angular typescript components

我试图通过将一个组件的引用传递给另一个组件来调用另一个组件函数,但出现“无法读取属性”错误。这是代码

警报组件

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

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

export class AlertComponent implements OnInit {  
  AlertMessage:string;

  constructor() {        
   }

  showSuccessAlert(){       
      this.AlertMessage =  "Data saved successfully.";
  }

  ngOnInit() {
  }

}

警报组件 html

<p>{{AlertMessage}}</p>

我正在从另一个组件调用 showSuccessAlert 函数

组件

import { Component, OnInit, Input, HostListener } from '@angular/core';
import { QueueService } from 'src/services/queue.service';
import { ActivatedRoute } from "@angular/router";
import { NgForm } from '@angular/forms';
import { Queue } from 'src/models/queue';
import { error } from 'util';
import { AlertComponent } from '../alert/alert.component';

@Component({
  selector: 'queue-edit',
  templateUrl: './queue.edit.component.html'  
})
export class QueueEditComponent implements OnInit{
    @Input() alert:AlertComponent;

    queue = new Queue();    
    constructor(private api: QueueService, private route: ActivatedRoute){
        this.route.params.subscribe(params => this.params = params);

    } 
    title = "Edit Support Queue";

    ngOnInit() { 
    }

    @HostListener('saveQueue')
    saveQueue(queue){
        this.alert.showSuccessAlert(); 
    }
}

html

<app-alert></app-alert>

错误

ERROR TypeError: Cannot read property 'showSuccessAlert' of undefined
    at QueueEditComponent.push../src/app/queue/queue.edit.component.ts.QueueEditComponent.saveQueue (queue.edit.component.ts:44)
    at Object.eval [as handleEvent] (QueueEditComponent.html:25)
    at handleEvent (core.js:19545)
    at callWithDebugContext (core.js:20639)
    at Object.debugHandleEvent [as handleEvent] (core.js:20342)
    at dispatchEvent (core.js:16994)
    at core.js:17441
    at HTMLButtonElement.<anonymous> (platform-browser.js:993)
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:14051)

最佳答案

您应该使用@ViewChild而不是@Input。像这样的事情:

import { ..., ViewChild } from '@angular/core';
...
import { AlertComponent } from '../alert/alert.component';

@Component({...})
export class QueueEditComponent implements OnInit{
    @ViewChild(AlertComponent) alert:AlertComponent;

    ...

    @HostListener('saveQueue')
    saveQueue(queue){
        this.alert.showSuccessAlert(); 
    }
}

PS:在调用 ngAfterViewInit 之前,您将无法访问 QueueEditComponent 中的 AlertComponent。因此,请确保您的 saveQueuengAfterViewInit 之后的某个时间被调用。

关于javascript - 从另一个组件调用组件函数 — 出现 "Cannot read property"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618423/

相关文章:

angular - 内部带有 *ngIf 的模板,更改模型后不起作用

javascript - ul 中的交换列表和事件元素位置保持不变

用于动态 HTML 页面的 PHP 与 JavaScript

javascript - new Date() - Angular 2

reactjs - 是否可以使用 Graph Toolkit 2.0 在 Microsoft Teams 选项卡中进行静默身份验证

angular - ionic 2 : Modal doesn't close when clicking on backdrop

javascript - typescript 中的范围变量

javascript - 组合中的默认值不可见 - extjs

javascript - 如何从 Service Worker 对象调用 React 类的函数?

javascript - 如何处理 "Go"/"Enter"keyboard button Ionic2 <ion-input>