Я пытаюсь настроить приложение, использующее NGRX.
У меня проблемы с доступом к возвращенным параметрам сущностей, когда предполагается загрузка одной сущности.
У меня также возникают проблемы при загрузке сущности в модальной форме из-за невозможности доступа к параметрам сущности.
Сначала список сотрудников вызывается из серверной части через 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; }