【问题标题】:Combining multiple/redundent ngrx Store select statement结合多个/冗余的ngrx Store select语句
【发布时间】:2018-12-05 03:02:24
【问题描述】:

我正在使用 ngrx/angular4+ 开发应用程序。 这里正在开发的设计模式似乎非常多余,它与您订阅 Store reducer 的方式有关。

在一个组件中,以下情况并不少见:

HOFDetails$:Observable<any>;
HOFDetails$SUB:ISubscription;
HOFMobile$:Observable<any>;
HOFMobile$SUB:ISubscription;
HOFMobile:any;
HOFHome$:Observable<any>;
HOFHome$SUB:ISubscription;
HOFHome:any;
SPDetails$:Observable<any>;
SPDetails$SUB:ISubscription;
SPMobile$:Observable<any>;
SPMobile$SUB:ISubscription;
SPMobile:any;
SPHome$:Observable<any>;
SPHome$SUB:ISubscription;
SPHome:any;
EmergencyDetails$:Observable<any>;
EmergencyDetails$SUB:ISubscription;
EmergencyDetails:any;
EmergencyMobile$:Observable<any>;
EmergencyMobile$SUB:ISubscription;
EmergencyMobile:any;
EmergencyHome$:Observable<any>;
EmergencyHome$SUB:ISubscription;
EmergencyHome:any;
EmergencyList$:Observable<any>;
EmergencyList$SUB:ISubscription;
EmergencyList:any;
countries$:Observable<any>;
countries$SUB:ISubscription;
countries:any;
valueIds$:Observable<any>;
valueIds$SUB:ISubscription;
valueIds:any;
lang$:Observable<any>;
lang$SUB:ISubscription; 
//the subscriptions
    this.lang$ =  this.store.select(fromroot.getLanguage);
    this.lang$SUB = this.lang$.subscribe((v:string)=>this.lang = v);
    this.HOFDetails$ = this.store.select(from_costumer.getHOF);
    this.HOFDetails$SUB = this.HOFDetails$.subscribe((v)=> {});
    this.HOFMobile$ = this.store.select(from_costumer.getHOFMobile);
    this.HOFMobile$SUB = this.HOFMobile$.subscribe((v)=> {});
    this.HOFHome$ = this.store.select(from_costumer.getHOFHome);
    this.HOFHome$SUB = this.HOFHome$.subscribe((v)=> {});
    this.SPDetails$ = this.store.select(from_costumer.getSP);
    this.SPDetails$SUB = this.SPDetails$.subscribe((v)=> {});
    this.SPMobile$ = this.store.select(from_costumer.getSPMobile);
    this.SPMobile$SUB = this.SPMobile$.subscribe((v)=> {});
    this.SPHome$ = this.store.select(from_costumer.getSPHome);
    this.SPHome$SUB = this.SPHome$.subscribe((v)=> {});
    this.EmergencyDetails$ = this.store.select(from_costumer.getEmergency);
    this.EmergencyDetails$SUB = this.EmergencyDetails$.subscribe((v)=>this.EmergencyDetails = v);
    this.EmergencyList$ = this.store.select(from_costumer.getEmergencyList);
    this.EmergencyList$SUB = this.EmergencyList$.subscribe((v:any)=> {});
    this.EmergencyMobile$ = this.store.select(from_costumer.getEmergencyMobile);
    this.EmergencyMobile$SUB = this.EmergencyMobile$.subscribe((v:any)=> {});
    this.EmergencyHome$ = this.store.select(from_costumer.getEmergencyHome);
    this.EmergencyHome$SUB = this.EmergencyHome$.subscribe((v:any)=> {});
    this.countries$ = this.store.select(from_geo.getCountries);
    this.countries$SUB = this.countries$.subscribe((v:any)=> this.countries = v);
    this.valueIds$ = this.store.select(from_geo.getCountryIds);
    this.valueIds$SUB = this.valueIds$.subscribe((v:any)=>this.valueIds = v);

所有这些代码仅适用于 this 上的 13 个属性,不包括订阅和取消订阅中的分配逻辑。

这在我看来是难以置信的重复和冗余。

有没有办法将所有这些打包成某种可重复使用的包? 可能是基于组件,还是基于路由?

【问题讨论】:

    标签: angular angular5 ngrx angular6 ngrx-store


    【解决方案1】:

    删除订阅,删除未打包的变量(例如countries:any;)。你剩下的只是Observables。将它们放在容器(智能)组件中,并使用 async 管道将这些可观察对象绑定到您的(哑)表示组件。

    例如:

    lang$ : Observable<whatevertype>;
    
    constructor(){
       this.lang$ =  this.store.select(fromroot.getLanguage);
    }
    

    在模板中:

    <your-presentational-component [lang]="lang$ | async"><your-presentational-component>
    

    然后async 管道接管订阅、取消订阅和将实际值分配给您实际使用它们的子组件。

    【讨论】:

    • 好答案。直接初始化类属性而不是在构造函数内部初始化有什么区别,就像我的回答一样?有什么优缺点吗?
    • 好吧,我个人的偏好是在构造函数中,因为这是我使用所有store.selects 的地方,所以我有一个地方可以查看。它是一个心理模型,一切都从构造函数开始,因此它是从那里存储数据的好地方。但同样,只是偏好。
    • 我明白了,所以没有对错。感谢您的澄清。
    • 不错!没有这个,使用带有绑定的异步管道
    • 谢谢,这确实缩短了代码的语法......但我正在寻找一种解决方案,将所有这些打包到某种抽象的可重用包中
    【解决方案2】:

    在您的容器组件中将其缩短为:

    // inject ngrx store in constructor
    constructor(private store: Store) {}
    
    // lang$ as class property, no extra code needed.
    lang$: Observable<any> = this.store.select(fromroot.getLanguage);
    

    您可能不需要设置本地属性 this.lang,只需将 observables 传递给您的任何展示组件并使用异步管道。

    【讨论】:

    • 谢谢,这确实缩短了代码的语法......但我正在寻找一种解决方案,将所有这些打包到某种抽象的可重用包中
    • 也许您正在寻找类似github.com/johnpapa/angular-ngrx-data 的东西?它抽象了 redux 本身的大部分内容。
    • 检查...检查...它说实验...之后-> tldr。不过我相信我稍后会回来查看它
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多