当前位置: 首页 > 知识库问答 >
问题:

如何订阅Angular2中某项服务的活动?

裴硕
2023-03-14

我知道如何用EventEmitter引发事件。如果我有一个这样的组件,我还可以附加一个要调用的方法:

<component-with-event (myevent)="mymethod($event)" />

当我有这样一个组件时,一切都很好。我将一些逻辑移到了服务中,我需要从服务内部引发一个事件。我做的是这样的:

export class MyService {
  myevent: EventEmitter = new EventEmitter();

  someMethodThatWillRaiseEvent() {
    this.myevent.next({data: 'fun'});
  }
}

我有一个组件需要根据此事件更新一些值,但我似乎无法使其工作。我尝试的是这样的:

//Annotations...
export class MyComponent {
  constructor(myService: MyService) {
    //myService is injected properly and i already use methods/shared data on this.
    myService.myevent.on(... // 'on' is not a method <-- not working
    myService.myevent.subscribe(.. // subscribe is not a method <-- not working
  }
}

当引发事件的服务不是组件时,如何使MyComponent订阅该事件?

我在 2.0.0-alpha.28 上

编辑:修改了我的“工作示例”以实际工作,因此可以将重点放在不工作的部分;)

示例代码:http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv

共有3个答案

傅彬
2023-03-14

库原因的快速修复,添加了事件导入,如

import { EventEmitter } from 'events';

您必须使用订阅通过核心库进行更改

import { EventEmitter } from '@angular/core';
赫连飞沉
2023-03-14

使用 alpha 28,我通过 eventEmitter.toRx().subscribe(..) 方法以编程方式订阅事件发射器。由于它不直观,因此可能会在将来的版本中进行更改。

缪兴腾
2023-03-14

更新:我找到了一种更好/正确的方法来解决此问题,使用行为主体或可观察量而不是事件发射器。请看这个答案:https://stackoverflow.com/a/35568924/215945

此外,Angular文档现在有一个使用主题的食谱示例。

原始/过时/错误答案:同样,不要在服务中使用事件发射器。这是一种反模式。

使用beta.1… NavService包含EventEmiter。组件导航通过服务发出事件,组件观察组件订阅事件。

导航服务.ts

import {EventEmitter} from 'angular2/core';
export class NavService {
  navchange: EventEmitter<number> = new EventEmitter();
  constructor() {}
  emitNavChangeEvent(number) {
    this.navchange.emit(number);
  }
  getNavChangeEmitter() {
    return this.navchange;
  }
}

组件.ts

import {Component} from 'angular2/core';
import {NavService} from '../services/NavService';

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservingComponent {
  item: number = 0;
  subscription: any;
  constructor(private navService:NavService) {}
  ngOnInit() {
    this.subscription = this.navService.getNavChangeEmitter()
      .subscribe(item => this.selectedNavItem(item));
  }
  selectedNavItem(item: number) {
    this.item = item;
  }
  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'my-nav',
  template:`
    <div class="nav-item" (click)="selectedNavItem(1)">nav 1 (click me)</div>
    <div class="nav-item" (click)="selectedNavItem(2)">nav 2 (click me)</div>
  `,
})
export class Navigation {
  item = 1;
  constructor(private navService:NavService) {}
  selectedNavItem(item: number) {
    console.log('selected nav item ' + item);
    this.navService.emitNavChangeEvent(item);
  }
}

扑通一声

 类似资料:
  • 第一,我试过了 第二,我尝试了下面的。(使用onErrorResumeNext),但取消了订阅。 (未调用onError,但调用OnComplete。因此已取消订阅) 第三,我试了下面。(带重试) 这比第一好。但没有刻录。 我想使刷新按钮,工作后错误。 我想知道 null 对不起,我的英语太差了。

  • 我在spring中有一个服务,它需要使用十种不同的方法获取数据。 我希望这些方法并行执行,以执行一些DB操作并返回到父线程。但是父线程应该等到所有响应出现,然后返回响应。 在我当前的方法中,我使用反应式mono异步执行所有方法,但主线程不等待订阅者方法完成。 下面是我订阅的两种方法 下面是我的主要方法 以下是我的输出: 我的输出显示,主线程没有等待订阅服务器完成其任务,因此我如何处理这种情况?

  • 我有一个使用ActiveMQ的JMS生产者/订阅者的简单Spring应用程序,配置如下: 我试过所有可能的解决办法,但没有一个奏效。我们非常感谢任何帮助

  • mysql会员订阅数据表的设计应该如何设计?产品有订阅商品和非订阅的,每次都只能购买一个。 订阅有1个月 3个月的 每次到期自动扣费。如果在一个月类购买了几个订阅商品 则扣费按照最新的一个 然后延长到期时间。其实是不是每次订阅都不需要生成新订单的 翻阅了其他资料都找不到很好的设计

  • 我正在尝试使用spring-integration-kafka-2.1.0。在我公司的项目中发布。但是,由于下面列出的例外情况,它不起作用:org。springframework。信息。MessageDeliveryException:Dispatcher没有频道“org”的订户。springframework。网状物上下文WebApplicationContext:/order。“奥Kafka”