如何在没有@Output装饰器的情况下使用EventEmitter?

时间:2018-04-04 07:54:08

标签: angular angular2-services

在Angular 4或2中,我想从组件向服务发出一个与组件无关的事件。

发出动作后,将在服务中处理。有人可以给我一个代码示例或任何替代解决方案吗?

注意:该服务未在该组件中导入,并且不应调用组件中的任何服务方法,但服务可以调用组件方法。

3 个答案:

答案 0 :(得分:1)

您可以在组件中使用创建新主题并从服务订阅该主题。当您需要触发事件时,您可以调用subject.next()。并且将更新服务中的订阅。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { TestComponent } from './test.component';

import {AppService} from './app.service';


@NgModule({
  declarations: [
    AppComponent,
    TestComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [AppService],
  bootstrap: [AppComponent]
})
export class AppModule { }
import { Injectable } from '@angular/core';

import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';

import { AppComponent } from './app.component';

@Injectable()
export class AppService {

    constructor() {
        AppComponent.getSubject().subscribe((response) => {
            this.doSomething(response);
        });
    }

    public doSomething(response): void {
        console.log('Event triggered', response);
    }
}
import { Component } from '@angular/core';

import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  private static subject = new Subject<string>();

  public static getSubject(): Observable<string> {
    return AppComponent.subject.asObservable();
  }

  public onClick(): void {
    AppComponent.subject.next('Test');
  }
}
import { Component } from '@angular/core';
import { AppService } from './app.service';

@Component({
  selector: 'app-test',
  template: `<div>test component</div>`
})
export class TestComponent {
 constructor(private appService: AppService) {
 }
}

答案 1 :(得分:0)

您可以订阅服务中的组件EventEmitter

myComponent.myEvent.subscribe((data) => console.log(data));

答案 2 :(得分:0)

如上所述@Ric评论,请仔细考虑为什么要从服务访问组件(反之亦然)。

如果您出于某种原因需要,并且您不想发生事件, 在他们之间共享服务,并订阅更改。它类似于angular的示例,但在您的情况下,父级是服务而不是组件,因此所有其他方法都不是有效的: https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

如果由于某种原因,这种方法不符合您的要求 - 你可以使用回调(注意:我个人不会使用这种方法)。

在此处查看示例: https://yakovfain.com/2016/10/31/angular-2-component-communication-with-events-vs-callbacks/

祝你好运!