如何在Angular中的事件函数内调用组件的方法?

Posted

技术标签:

【中文标题】如何在Angular中的事件函数内调用组件的方法?【英文标题】:How to call a method of component inside a function of an event in Angular? 【发布时间】:2020-12-10 07:27:17 【问题描述】:

我有以下ChatPanelComponent,其中我创建了getSocket 方法来获取套接字并在连接套接字时调用onopen EventListener。

import  AfterViewInit, Component, ElementRef, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren, ViewEncapsulation  from '@angular/core';
import  NgForm  from '@angular/forms';
import  HttpClient  from '@angular/common/http';

import  Subject  from 'rxjs';
import  takeUntil  from 'rxjs/operators';

import  FuseSidebarService  from '@fuse/components/sidebar/sidebar.service';
import  FusePerfectScrollbarDirective  from '@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive';
import  ChatPanelService  from 'app/layout/components/chat-panel/chat-panel.service';
import  WebsocketService, UserService  from 'app/core/services';

@Component(
    selector     : 'chat-panel',
    templateUrl  : './chat-panel.component.html',
    styleUrls    : ['./chat-panel.component.scss'],
    encapsulation: ViewEncapsulation.None
)
export class ChatPanelComponent implements OnInit, AfterViewInit, OnDestroy

   contacts: any[];
   chat: any;
   selectedContact: any;
   ws: any;
   ws_url: any;
   user_id: any;
   
   constructor(
        private _chatPanelService: ChatPanelService,
        private _user: UserService,
        private _WebSocket: WebsocketService,
   )

   ngOnInit(): void
   
       this.ws_url = 'http://localhost:8000/thread/';
       this.user_id = this._user.getUser().id;
       this.getSocket(this.user_id);
   

   getSocket(id: any) 
       this.ws = this._WebSocket.connect(this.ws_url+id+'/');
 
       this.ws.onopen = function(e)
           console.log("WEBSOCKET OPEN", e);
       

       this.ws.onmessage = function(e) 
           this.showMessage(e);
       
  

  showMessage(msg: any)
       console.log("MESSAGE", msg);
  

我想在onmessage 事件发生时调用showMessage(msg: any) 方法,并将事件数据传递给showMessage() 方法。但是当调用该方法时,会出现以下错误:

ERROR TypeError: this.showMessage is not a function
    at WebSocket.ws.onmessage [as __zone_symbol__ON_PROPERTYmessage]

我想不出任何其他方法来调用该方法。我需要这方面的帮助。 提前致谢!

【问题讨论】:

【参考方案1】:

您是否尝试过使用箭头功能?它保留了上下文。

this.ws.onmessage = (e) => this.showMessage(e);

【讨论】:

谢谢你!这对我有用。该消息现在正在控制台上打印。【参考方案2】:

因为事件回调是在 Angular 的上下文之外执行的,所以this 指的是回调事件的上下文而不是 Angular 组件。所以this 不再引用组件的上下文。

您可以将this 的值保存在任何其他局部变量中并使用它:

getSocket(id: any) 
       this.ws = this._WebSocket.connect(this.ws_url+id+'/');
 
       this.ws.onopen = function(e)
           console.log("WEBSOCKET OPEN", e);
       

       const self = this; // <- store this value in a local variable

       this.ws.onmessage = function(e) 
           self.showMessage(e); //<- use that local variable containing value of component's context
       

有关它的更多详细信息,请参阅此答案: https://***.com/a/20279485/9722122

【讨论】:

谢谢你 Mustahsan,你的方法对我有用。非常感谢!

以上是关于如何在Angular中的事件函数内调用组件的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2:如何从子组件调用主组件功能

如何在Angular中的组件中调用服务类中的函数

从 Angular 中的 JavaScript 文件调用 Typescript 函数

如何在 Angular 1.5 组件中监听范围事件?

如何从Angular中的另一个组件调用组件的ngOnit函数

如何从另一个组件调用一个函数,同时保持另一个组件在 Angular 中的通用性?