【问题标题】:How to store multiple model query into single state store State Management如何将多个模型查询存储到单个状态存储状态管理
【发布时间】:2019-07-18 07:41:39
【问题描述】:

我想创建具有多个查询状态模型的单个商店。 因此,无论我想在哪里选择特定的组件或服务,都可以从商店中选择特定的组件或服务。

Akita State Management 是否可以做到这一点。

例如:

@Injectable({ providedIn: 'root' })
export class Query1 extends QueryEntity<myState, School> {

  constructor(protected store: myStore) {
    super(store);
  }

}


@Injectable({ providedIn: 'root' })
export class Query2 extends QueryEntity<myState, Employee> {

  constructor(protected store: myStore) {
    super(store);
  }

}

所以如果我查询特定的 Query1 或 Query2 服务在组件中获得相应的订阅。

学校组件

var query1 = Quer1.selectAll();

员工组件

var query2 = Quer2.selectAll();

任何人都建议我正确的方法来实现相同的目标。

【问题讨论】:

    标签: angular-akita akita


    【解决方案1】:

    你可以做var query1 = Quer1.selectAll({filterBy: (entity:any) =&gt;(entity.staffDept === 'SomeDepartment') &amp;&amp; (entity.staffId === someID});,或者更合适的方式

    @Injectable({
      providedIn: 'root'
    })
    export class DeliveryQuery extends QueryEntity<DeliveryState, Delivery> {
      selectVisibilityFilter$ = this.select(state => state.ui);
      selectVisibleDeliveries$ = combineLatest(
        this.selectVisibilityFilter$,
        this.selectAll(),
        this.getVisibleDelivery,
    
      );
    
      constructor(protected store: DeliveryStore) {
        super(store);
      }
    
    
    
      private getVisibleDelivery(filter, delivery): Delivery[] {
        switch (filter.filter) {
          case 'COMPLETED':
            switch (filter.drivername) {
              case 'All':
                return delivery.filter(d => (d.data.CHECKPOINT_CODE === 'DLC'));
              default:
                return delivery.filter(d => (d.data.CHECKPOINT_CODE === 'DLC') && (d.data.MOBILE_USER_ID === filter.drivername));
            }
          case 'FAILED':
            switch (filter.drivername) {
              case 'All':
                return delivery.filter(d => d.data.CHECKPOINT_CODE === 'DLP');
              default:
                return delivery.filter(d => (d.data.CHECKPOINT_CODE === 'DLP') && (d.data.MOBILE_USER_ID === filter.drivername));
            }
    
          case 'ASSIGNED':
            switch (filter.drivername) {
              case 'All':
                return delivery.filter(d => d.data.CHECKPOINT_CODE === 'ASSIGNED');
              default:
                return delivery.filter(d => (d.data.CHECKPOINT_CODE === 'ASSIGNED') && (d.data.MOBILE_USER_ID === filter.drivername));
            }
    
        }
      }
    }
    

    然后你这样称呼它:this.list = this.deliveryQuery.selectVisibleDeliveries$

    我不确定这是否是最好的方法,但这是我通过修改文档中的方法得到的。希望它可以帮助。我自己也与秋田框架作斗争:)

    【讨论】:

    • 感谢您的回复。是的,这可能是一种可能的解决方案,但我选择了基本商店...+1 票。
    猜你喜欢
    • 2020-05-13
    • 2020-02-03
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多