【问题标题】:angular2 event defined in a service is not getting caught in the component服务中定义的 angular2 事件没有被组件捕获
【发布时间】:2016-05-16 16:25:32
【问题描述】:

我在我的 angular2 服务中使用 EventEmitter 触发一个事件。但是这个事件并没有被我的组件捕获。

我的服务(文件是 - 'app.service.ts'):

import {EventEmitter, Injectable, OnInit} from "angular2/core";
@Injectable()
export class AppService{
  private _event:EventEmitter<string> = new EventEmitter();
  ngOnInit(){
    setTimeout(() => this._event.emit("hello"),1000);
  }
  getEventRef(){
   return this._event;
  }
}

我的组件(文件是'./app.component.ts'):

import {Component, OnInit} from "angular2/core";
import {AppService} from "./app.service";

@Component({
selector: 'my-app',
template: '<h1>App</h1>',
providers: [AppService]
})
export class AppComponent implements OnInit{
  constructor(private _service:AppService){}
  ngOnInit(){
    _service.getEventRef()
      .subscribe(res => alert(res));
  }
}

但是我没有收到我应该在我的组件中获得的警报。我不确定该服务是否正在使用 .emit api 触发事件。

【问题讨论】:

    标签: angular angular2-services


    【解决方案1】:

    ngOnInit 钩子方法不能用于服务,只能用于组件。对于服务,您可以使用构造函数:

    @Injectable()
    export class AppService{
      private _event:EventEmitter<string> = new EventEmitter();
      constructor(){
        setTimeout(() => this._event.emit("hello"),1000);
      }
      (...)
    }
    

    另一个评论。最好将EventEmitter 仅用于组件通信。在您的情况下,请使用 ObservableSubject

    • 使用 Observable / Observer

      @Injectable()
      export class AppService{
        private _event:Observable<string> = Observable.create((observer:Observer) => {
          this._event$ = observer;
        }).share();
        constructor(){
          setTimeout(() => this._event$.next("hello"),1000);
        }
        (...)
      }
      
    • 使用 Subject 类。这个类既是可观察的又是观察者。

      @Injectable()
      export class AppService{
        private _event:Subject<string> = new Subject();
        constructor(){
          setTimeout(() => this._event.next("hello"),1000);
        }
        (...)
      }
      

    您还应该在组件中使用以下内容:

    ngOnInit(){
      this._service.getEventRef()
        .subscribe(res => alert(res));
    }
    

    代替:

    ngOnInit(){
      _service.getEventRef()
        .subscribe(res => alert(res));
    }
    

    查看这些插件:

    【讨论】:

    • 嗨,我也想使用 Observables,不想使用 EventEmitter。但是我无法获得有关如何使用 Observables 的适当文档。您能否请回复一些链接,我可以从中学习使用 rc1 版本的 angular2 实现 Observables?
    • 我删除了 ngOnInit。仍然无法使用 EventEmitter。
    • 您是否将ngOnIniy 替换为constructor?仅供参考的主题是可观察的;-) 我添加了一个带有原始可观察的样本。我相应地更新了我的答案......
    • 是的,我用构造函数替换了 ngOnInit。然后在构造函数中调用私有方法。该私有方法以 1 秒的延迟触发 setTimeout。在这个 setTimeout 中,我正在写 this._event.emit("hello")
    • 在您的组件中,您应该使用this._service.getEventRef() 而不是_service.getEventRef()。看到这个 plunkr:plnkr.co/edit/zIEKhreHcBTJzbkpjSOJ?p=preview.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2018-03-01
    • 2011-08-18
    • 2012-11-09
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多