javascript - Angular 服务不更新订阅的组件

标签 javascript angular observable angular-services

我有一个 Angular 2/4 服务,它使用可观察量与其他组件进行通信。

服务:

let EVENTS = [
    {
      event: 'foo',
      timestamp: 1512205360
    },
    {
      event: 'bar',
      timestamp: 1511208360
    }
  ];

@Injectable()
export class EventsService {

  subject = new BehaviorSubject<any>(EVENTS);

  getEvents(): Observable<any> {
    return this.subject.asObservable();
  }

  deleteEvent(deletedEvent) {
    EVENTS = EVENTS.filter((event) => event.timestamp != deletedEvent.timestamp);
    this.subject.next(EVENTS);
  }

  search(searchTerm) {
    const newEvents = EVENTS.filter((obj) => obj.event.includes(searchTerm));
    this.subject.next(newEvents);
  }
}

我的 home 组件能够订阅此服务并在删除事件时正确更新:

export class HomeComponent {

  events;
  subscription: Subscription;

  constructor(private eventsService: EventsService) { 
    this.subscription = this.eventsService.getEvents().subscribe(events => this.events = events);
  }

  deleteEvent = (event) => {
    this.eventsService.deleteEvent(event);
  }
}

我还有一个显示搜索表单的根组件。提交表单后,它会调用该服务,该服务执行搜索并使用结果调用 this.subject.next(参见上文)。但是,这些结果并未反射(reflect)在 home 组件中。我哪里错了?完整代码请参见plnkr.co/edit/V5AndArFWy7erX2WIL7N .

最佳答案

如果您多次提供服务,您将获得多个实例,但这不适用于通信,因为发送者和接收者没有使用同一个实例。

要为整个应用程序获取单个实例,请在 AppModule 中提供服务,而不是在其他地方提供服务。

Plunker example

关于javascript - Angular 服务不更新订阅的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46468365/

相关文章:

javascript - 仅内联处理程序有效

javascript - 脚本 block 的js执行机制

javascript - 服务器端 JQuery 数据表结果错误

javascript - 如何处理响应对象中的错误

javascript - 隐藏 URL 中传递的变量

javascript - 拉刷新奇怪的行为

angular - 在 Material2 中打开 mat-menu 时使用 mat-input

knockout.js - 以一种很好的表达方式增加一个 KnockoutJS observable

javascript - Angular 5 服务正在从 api 返回数据,但组件没有向我显示数据

javascript - Angular 2 可观察对象