Angular 2订阅不起作用

时间:2016-10-07 07:27:29

标签: angular subscribe

由于超出此问题范围的原因,我不得不停止使用@injectable。我转换了使用它的服务,只是手动新建它而不是使用@injectable它适用于所有服务,除了我使用subscribe的服务我使用订阅的服务在我必须删除之前工作@injectable。我可以在没有@injectable的情况下让它工作吗?

代码:

服务:

import { Subject } from 'rxjs/Subject';

export class ResultSelectionService {
  // Observable string sources
  private resultSelectedSource = new Subject();
  // Observable string streams
  resultSelected$ = this.resultSelectedSource.asObservable();
  // Service message commands
  selectResult(result: any, place: any) {
    this.resultSelectedSource.next({result: result, place: place});
  }
}

服务用户(selectResult函数执行 - Good):

//arrow function because when called above "this" is an html element
resultClick = (event) => {
    this.resultSelectionService.selectResult(event.data.result, event.data.place);
}

应该执行但不执行的方法(代码永远不会进入result => {

constructor( ) {
this.resultSelectionService = new ResultSelectionService();
    this.resultSelectionService.resultSelected$.subscribe(
        result => {

            this.selectedResult = { result };

            $('#result-details-modal').appendTo("body").modal('show');

            $('#result-details-modal').on('shown.bs.modal', (e) => {
                this.resizeMap();
                this.canGetAddress = true;
                this.addMarkersToMap(this.map);
                //this.bindAutoCompleteToMap();
            })
            console.log(this.selectedResult.result);
        });
}

我是否可以在不使用@injectable的情况下执行订阅功能?如果没有,我该如何解决这个问题?创造类似的东西?

1 个答案:

答案 0 :(得分:3)

您需要的是ResultSelectionService的单个实例,这就是为什么您的订阅方法永远不会被调用的原因。

您需要在@Injectable()上添加ResultSelectionService,将其添加到forRoot()模块方法中(或直接添加到AppModule的提供商中,如果它是&#39}。是你拥有的唯一模块)并使用它:

constructor( private resultSelectionService:ResultSelectionService ) {
    this.resultSelectionService.resultSelected$.subscribe(
        result => {

            this.selectedResult = { result };

            $('#result-details-modal').appendTo("body").modal('show');

            $('#result-details-modal').on('shown.bs.modal', (e) => {
                this.resizeMap();
                this.canGetAddress = true;
                this.addMarkersToMap(this.map);
                //this.bindAutoCompleteToMap();
            })
            console.log(this.selectedResult.result);
        });
}

这样,您就可以确保在您的应用中只提供了ResultSelectionService的一个实例,并且您可以从任何地方触发观察结果。