Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular NGRX reducer函数返回2个对象_Angular_Typescript_Rxjs_Ngrx - Fatal编程技术网

Angular NGRX reducer函数返回2个对象

Angular NGRX reducer函数返回2个对象,angular,typescript,rxjs,ngrx,Angular,Typescript,Rxjs,Ngrx,我在一个在线课程的帮助下创建了一个reducer函数,但它并没有完全按照我的预期工作 这是我按下列表中的3辆车后给出的控制台窗口。蓝色数字是ID,当我按下列表中的对象时,它就会触发 首先,我按下ID为93的车辆“1075” 之后,我按下ID为92的车辆“1072” 最后,我按下ID为91的车辆“1067” 现在它首先返回“previous”对象,这是我第一次按下它时的一个空数组,几秒钟后它返回我按下的对象 我的代码如下所示: // initial state export const init

我在一个在线课程的帮助下创建了一个reducer函数,但它并没有完全按照我的预期工作

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

  • 首先,我按下ID为93的车辆“1075”
  • 之后,我按下ID为92的车辆“1072”
  • 最后,我按下ID为91的车辆“1067”
  • 现在它首先返回“previous”对象,这是我第一次按下它时的一个空数组,几秒钟后它返回我按下的对象

    我的代码如下所示:

    // 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)是console窗口中正在记录的内容)

    错误在哪里

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


    如何才能只返回我最近在列表中按下的对象?

    单击即订阅。这意味着,在开始时以及每次存储更改时都会触发观察者。不应单击即订阅。单击即订阅,单击即发送

    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上订阅。每次存储更改时,都会触发观察者。单击时会添加一辆新车辆。单击后,会创建一辆新车辆并将其添加到存储中。然后更改存储并触发观察者。

    您在单击时订阅。这意味着您的观察者在开始和结束时都会被触发每次商店更改时。您不应该单击订阅。在init上订阅并在单击时发送。非常感谢@ThomasSablik订阅的一个好处是它对设置我的地图很有用。如果我尝试在.subscribe()之外使用我的“this.setMarkers()”函数它不会做任何事情,因为在我单击该项目后的第一秒钟内,位置未定义。是否有任何方法可以解决此问题,以便每当我的web api中的数据交付时,地图都会放大到正确的位置?非常感谢!