角度6消息总线

时间:2019-02-11 22:11:32

标签: angular events messaging bus

当前,我们的团队开发了具有少量组件的简单的angular 6应用程序,并且它们工作正常,但是我们知道这些组件之间的耦合程度太高(他们对自己的了解太多)。因此,自然而然地,我们希望转向在Angle 6应用程序内的流行事件/消息总线这样的解耦解决方案。

因此,组件应该彼此了解而不是互相服从,而应该只了解消息总线,而只关心发布到总线上并订阅了什么。

此示例实现基于 Subscription 类,但根据Internet更好的解决方案,将使用 BehaviorSubject

所以我有一些问题:

  1. 值得更改订阅-> BehaviorSubject吗?

    1. 拥有订阅列表而不是现在有一个列表更好吗?
    2. 如何为订阅设置“订阅”的初始值?
    3. 如果我想摆脱频道,并且想使用其他类似消息类名称空间的东西,那么如何获得它呢?很好吗?

    从“ @ angular / core”导入{Injectable}; 从'rxjs / Rx'导入{Observable,Subject}; 从'rxjs / operators'导入{过滤器,地图};

    导出接口IClassConstructor {     new(... args:any []):T; }

    导出接口IMessage {     频道:功能;     内容:任何; } / **简单的基于类的发布/订阅消息总线,以提供事件,动作,命令的分离通信* / @Injectable() 导出类MessageService {     私人消息= new Subject();

    public publish<T>(messageInstance: T): void {   // Flux/Redux: 'dispatch'
        const channel = messageInstance.constructor;
        this.message.next({'channel': channel, 'content': messageInstance}); // Redux: {'type': string, 'payload': any }
    }
    
    public subscribe<T>(messageClass: IClassConstructor<T>): Observable<T> {
        const channel: IClassConstructor<T> = messageClass;
        return this.message.pipe(
            filter((message: IMessage) => {
                return message.channel === channel;
            }),
            map((message: IMessage) => {
                return message.content;
            })
        );
    }
    

    }

0 个答案:

没有答案