2017-09-28 40 views
0

我有一个Angular 2/4服务,它使用observables与其他组件进行通信。角度服务没有更新订阅组件

服务:

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,结果如上所示。但是,这些结果并未反映在home组件中。我哪里错了?完整代码请参见plnkr.co/edit/V5AndArFWy7erX2WIL7N

回答

1

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

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

Plunker example