【问题标题】:Send data to all subscribers elements with observable - angular2使用 observable - angular2 向所有订阅者元素发送数据
【发布时间】:2016-06-28 16:06:25
【问题描述】:

我想将数据发送到我所有称为“模态”的元素,但只有其中一个接收消息。

我有一个服务:

@Injectable()
export class ModalService {

private _isOpen = new Subject();
isOpen$ = this._isOpen.asObservable();

open(id: string) {
    this._isOpen.next({isOpen: true, id: id});
}

close(id: string) {
    this._isOpen.next({isOpen: false, id: id});
}

和组件:

import {Component, Input} from 'angular2/core';
import {Observable} from 'rxjs/Observable';
import {Subject} from 'rxjs/Subject';

import {ModalService} from './modal.service';


@Component({
     selector: 'modal',
     template: `
     <ng-content></ng-content>`,
     styleUrls: ['app/workshop/modal.component.css'],
     providers: [ModalService],

})

export class ModalComponent {

@Input() ID;

private show = false;

constructor(private _modal: ModalService) {

    this._modal.isOpen$.subscribe(
        (value) => {
            console.log(value)
            if(this.ID === value.id) {
                this.show = value.isOpen;
            }
        }
    );

}

open() {
    this._modal.open(this.ID);
}

close() {
    this._modal.close(this.ID);
}

}

一切正常,但是当我想在任何其他组件中注入服务并向其他订阅者发送消息时,问题就出现了。我不知道如何为“模态”的所有元素类型共享消息。我可以挂钩 DOM 元素,但组件有问题。我如何将所有“模态”元素挂钩到可观察的?

感谢您的帮助

【问题讨论】:

  • 你们在哪里提供ModalService?您在其中注入它的每个组件或仅全局注入一次(bootstrap() 或根组件)?
  • 我编辑我的帖子(组件代码)。我在每个组件中注入服务。

标签: javascript typescript angular observable


【解决方案1】:

事实上,您需要为所有这些组件共享同一个实例。为此,请在主组件的providers 属性中设置服务:

@Component({
  (...)
  providers: [ ModalService ]
})
export class AppComponent {
  (...)
}

【讨论】:

  • 对不起,我不将标题加入代码。我现在添加了这个。
  • 我认为您应该从 ModalComponent 组件的提供者中删除 ModalService 并将其仅移动到主要组件。现在,每个模态组件实例都有一个服务实例...
猜你喜欢
  • 2020-06-11
  • 2019-06-16
  • 1970-01-01
  • 2018-04-05
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多