Angular 9 从组件到服务的传递方法

Angular 9 pass method from component to a service

我有一些 websocket 代码,我在其中向 websocket 服务器发送消息并收到回复。

这段代码工作正常,但我想把它放在一个服务中,然后从组件中调用它。

下面是组件中的代码:

import { Component } from '@angular/core';
import {webSocket, WebSocketSubject} from 'rxjs/webSocket';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {

  myWebSocket: WebSocketSubject<any> = webSocket('ws://localhost:8888');

  constructor() {

    this.myWebSocket.subscribe(
      msg => console.log('message received: ' + msg),
      err => console.log(err),
      () => console.log('complete')
   );

  }

  sendMessageToServer(msg) {
    const dte = Date.now();
    this.myWebSocket.next({message: `${msg} - ${dte}` });
  }

}

我现在已经创建了一个服务:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class WsService {

  constructor() { }
}

我该怎么做...哪些部分从组件到服务...例如,我是在服务内部还是在组件中订阅?

您需要将服务引入您的组件。脚步: 将您的服务导入组件。

import { WsService} from 'path/to/WsService';

引入本地字段private wsService: WsService; 将您的服务添加到组件构造函数中:

constructor(wsService: WsService)
{
    this.wsService = wsService;
}

像这样使用您的服务:this.wsService.Method()

Joe,当您有服务时,想法是 "subscribe" 是 IN 组件。好吧,你可以转移到服务所有其他订阅

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class WsService {
  myWebSocket: WebSocketSubject<any> = webSocket('ws://localhost:8888');

  constructor() {
  }

  sendMessageToServer(msg) {
    const dte = Date.now();
    this.myWebSocket.next({message: `${msg} - ${dte}` });
  }
}

并在组件中订阅 ws.myWebSocket(我喜欢在 ngOnInit 中订阅)

export class AppComponent implements OnInit {
  constructor(private ws:WsService ) {

  ngOnInit()
  {
     this.ws.myWebSocket.subscribe(
      msg => console.log('message received: ' + msg),
      err => console.log(err),
      () => console.log('complete')
   );
  }
  addMessage(msg)
  {
   this.ws.sendMessageToServer(msg)
  }
}