代码之家  ›  专栏  ›  技术社区  ›  Nasrul Bharathi

如何在没有@Output decorator的情况下使用EventEmitter?

  •  1
  • Nasrul Bharathi  · 技术社区  · 6 年前

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

    发出后,将发生一个操作,并在服务中进行处理。有人能给我一个代码示例或其他解决方案吗?

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

    3 回复  |  直到 6 年前
        1
  •  2
  •   CornelC    6 年前

    您可以订阅组件 EventEmitter 在服务中。

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

        2
  •  1
  •   Anuradha Gunasekara    6 年前

    您可以使用在组件中创建新主题,并从服务订阅该主题。当需要触发事件时,可以调用subject。下一步()。并更新服务中的子描述。


    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) {
     }
    }
    
        3
  •  0
  •   Rotem jackoby    6 年前

    正如上面的@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/

    祝你好运