NGRX reducer函数返回2个对象

时间:2018-07-18 07:21:16

标签: angular typescript rxjs ngrx

我已经在在线课程的帮助下创建了一个reducer函数,但是它不能完全满足我的要求。

enter image description here

这是我按下列表中的3辆车后显示的控制台窗口。蓝色数字是ID,当我按下列表中的对象时,它就会触发。

  1. 首先,我按下ID为93的车辆“ 1075”。
  2. 之后,我按下ID为92的车辆“ 1072”。
  3. 最后我按下ID为91的车辆“ 1067”。

现在,它首先返回“上一个”对象”,这是我第一次按下时的一个空数组,然后几秒钟后,它返回了我按下的对象。

我的代码如下:

// initial state
export const initialState: VehicleDetailState = {
  entities: [],
  loaded: false,
  loading: false
};


// my reducer


 export function reducer(
      state = initialState,
      action: fromVehicleDetail.VehicleDetailAction
    ): any {
      switch (action.type) {
        case fromVehicleDetail.LOAD_VEHICLEDETAIL_SUCCESS: {
          const vehicledetail = action.payload;
          const entities = vehicledetail;
          return {
            entities
          };
        }
      }
      return state;
    }

在“ LOAD_VEHICLEDETAIL”的情况下,我尝试返回不同的内容,但是,每当尝试执行此操作时,都会由于该部分代码而返回错误:

// my listcomponent 
onClick() {

this.store.select(fromStore.getAllVehicleDetail).subscribe(data => {
      this.vehicleDetail = data;
      console.log(this.vehicleDetail);

      if (this.vehicleDetail.position) {
        this.setMap();
        this.setMarkers();
        return;
      }
      this.failSetMap();
      this.setMarkers();
    });
    this.store.dispatch(new fromStore.LoadVehicleDetail());
  }

}

(console.log(this.vehicleDetail)是在控制台窗口中记录的内容。

错误所在

  

TypeError:无法读取未定义的属性“位置”

我该怎么做才能只返回列表中最近按下的对象?

1 个答案:

答案 0 :(得分:0)

您点击订阅。这意味着,您的观察员会在商店开始和每次更改时被触发。您不应该点击订阅。在初始化时订阅,在点击时发送。

onInit() {

  this.store.select(fromStore.getAllVehicleDetail).subscribe(data => {
      this.vehicleDetail = data;
      console.log(this.vehicleDetail);

      if (this.vehicleDetail.position) {
        this.setMap();
        this.setMarkers();
        return;
      }
      this.failSetMap();
      this.setMarkers();
    });
  }
}

onClick() {
  this.store.dispatch(new fromStore.LoadVehicleDetail());
}

在此代码段中,观察者订阅了init。每次商店更改时,都会触发观察者。单击添加新的车辆。单击后,将创建新的车辆并将其添加到商店。然后更改商店并触发观察者。