NGRX не может прочитать параметры сущностей

Я пытаюсь настроить приложение, использующее NGRX.

У меня возникают трудности с доступом к возвращаемым параметрам Entity, когда должен быть загружен один объект.

У меня также возникают проблемы с загрузкой объекта в модальной форме из-за невозможности доступа к параметрам объекта.

Сначала список сотрудников вызывается из серверной части через data.service.

data.service.ts:

  getEngineers() {
return this.http.get<Engineer[]>(this.engineersUrl);
}

который возвращает всех зарегистрированных инженеров.

После того, как все записи инженеров перечислены, Engineer-list.componenent.ts добавляет функцию editEngineer:

  editEngineer(engineer: Engineer) {
this.store.dispatch(new engineerActions.LoadEngineer(engineer.id));
this.openEditDialog(engineer);
console.log(engineer.id, 'selectedEngineersId');
 }

 openEditDialog({ Name, LastName, PhoneNumber, Company, Country }: Engineer) 
{
const dialogRef = this.dialog.open(EgnineerEditDialogComponent, {
  disableClose: true,
  width: '300px',
  data: {
    Name, LastName, PhoneNumber, Company, Country
  }
 });
}

Затем имеет место эффект loadEngineer $ ():

@Effect()
loadEngineer$: Observable<Action> = this.actions$.pipe(
    ofType<engineerActions.LoadEngineer>(
        engineerActions.EngineerActionTypes.LOAD_ENGINEER
    ),
    mergeMap((action: engineerActions.LoadEngineer) =>
        this.dataService.getEngineerById(action.payload).pipe(
            map(
                (engineer: Engineer) =>
                new engineerActions.LoadEngineerSuccess(engineer)
            ),
            catchError(err => of(new engineerActions.LoadEngineerFail(err)))
        )
    ),
);

data.service вызывает getEngineerById ():

  getEngineerById(payload: number): Observable<Engineer> {
     console.log(`${this.engineerUrl}?id=${payload}`);
      return this.http.get<Engineer>(`${this.engineerUrl}?id=${payload}`);
  }

Что возвращает json-ответ выбранного инженера из запроса php mysql:

$result = $conn->query($sql);

$emparray = $result->fetch_all( MYSQLI_ASSOC );
echo json_encode( $emparray );

Следующий шаг выполняется редуктором с LOAD_ENGINEER_SUCCESS

        case engineersActions.EngineerActionTypes.LOAD_ENGINEER_SUCCESS: {
        console.log(action.payload.id, ' - ID of the selected engineer object');
        return engineerAdapter.addOne(action.payload, {
            ...state,
           selectedEngineerId: action.payload.id,
           loading: false,
           loaded: true
        });

    }

Проблема здесь в том, что консоль зарегистрировала ответ редуктора

console.log(action.payload.id, ' - ID of the selected engineer object');

возвращает undefined " - ID of the selected engineer object", а логирование консоли возвращает "action.payload":

[{…}]
0:
Company: "Andys Shack"
Country: "EE"
LastName: "Franklichtenshtein    "
Name: "Angus    "
PhoneNumber: "123123123123    "
Registered: "2019-03-09 01:33:28"
id: "19"
__proto__: Object
length: 1
__proto__: Array(0)

и NGRX также возвращает ошибку:

entity.js:106 @ngrx/entity: The entity passed to the `selectId` implementation returned undefined. You should probably provide your own `selectId` implementation. The entity that was passed: [{…}]0: {id: "19", Name: "Angus    ", LastName: "Franklichtenshtein    ", PhoneNumber: "123123123123    ", Country: "EE", …}length: 1__proto__: Array(0) The `selectId` implementation: function (instance) { return instance.id; }

person Aivis Šteinfelds    schedule 14.03.2019    source источник


Ответы (1)


Полезная нагрузка - это массив, а не объект.

action.payload[0].id
person timdeschryver    schedule 14.03.2019