我的组件视图有问题。我有一个事件模型持有一个用户数组。当我加载事件时,我在redux devtools中获得了这个有效负载。因此,我们所需的所有数据都在有效负载中可用。问题在于,im只能在刷新页面(f5)时列出事件的用户。有人在代码中看到问题了吗?我认为问题不在状态之内,因为我在有效负载中获取了正确的数据...
**payload**
title(pin):"Lasergame"
description(pin):"Bring shoes with you"
location(pin):"Interpool"
creatorId(pin):1
users(pin): {users..} //here is the array which contains the users
id(pin):1
type(pin):"[API: /event] Load Event success"
这是html的相关内容:
<div *ngIf="ev$ | async; let ev">
<div class="row">
<div class="col-sm-8">
<div class="tab-panel">
<tabset class="member-tabset">
<tab heading="Om evenemang">
<h4 style="font-weight: bold;">Beskrivning</h4>
<p>{{ ev.description }}</p>
<ul *ngIf="ev.users">
<li *ngFor="let item of ev.users">
<p>
{{ item.email }}
{{ item.name }}
</p>
</li>
</ul>
</tabset>
</div>
</div>
</div>
</div>
这是event.ts
import { Component,OnInit,ChangeDetectionStrategy } from '@angular/core';
import { AppState } from 'src/app/core/state';
import { Store,select } from '@ngrx/store';
import * as fromEvent from '../../state/events';
import { Observable } from 'rxjs';
import { Event,User } from 'src/app/shared/models';
import * as eventactions from '../../state/events';
import { activatedRoute } from '@angular/router';
@Component({
selector: 'ex-event-detail',templateUrl: './event-detail.component.html',changeDetection: ChangeDetectionStrategy.OnPush,styleUrls: ['./event-detail.component.scss']
})
export class EventDetailComponent implements OnInit {
ev$: Observable<Event>;
constructor(private store$: Store<AppState>,private route: activatedRoute) {}
ngOnInit() {
this.LoadEvent();
console.log(this.ev$);
}
private LoadEvent(): void {
this.store$.dispatch(new eventactions.LoadEvent(this.getclickedId()));
this.ev$ = this.store$.pipe(select(fromEvent.getcurrentEvent));
}
private getclickedId() {
var id = Number(this.route.snapshot.paramMap.get('id'));
return id;
}
}
这是我的ngrx代码。
events.actions.ts
export class LoadEvent implements action {
readonly type = actionTypes.LOAD_EVENT;
constructor(public payload: number) {}
}
export class LoadEventSuccess implements action {
readonly type = actionTypes.LOAD_EVENT_SUCCESS;
constructor(public payload: Event) {}
}
events.effects.ts
@Effect()
loadEvent$: Observable<action> = this.actions$.pipe(
ofType<eventsactions.LoadEvent>(eventsactions.actionTypes.LOAD_EVENT),mergeMap((action: eventsactions.LoadEvent) =>
this.eventResource.loadEvent(action.payload).pipe(
map((event: Event) => new eventsactions.LoadEventSuccess(event)),catchError(err => of(new eventsactions.LoadEventError(err)))
)
)
);
events.reducer.ts
case eventsactions.actionTypes.LOAD_EVENT_SUCCESS: {
return adapter.addOne(action.payload,{
...state,selectedEventId: action.payload.id
});
}
events.selectors.ts
const { selectAll } = adapter.getSelectors();
export const selectState = (state: AppState) => state.event.evs;
export const getcurrentEventId = createSelector(selectState,state =>
state.selectedEventId)
export const getcurrentEvent = createSelector(selectState,getcurrentEventId,state =>
state.entities[state.selectedEventId])
events.adapter.ts
export const adapter: EntityAdapter<Event> = createEntityAdapter<Event>({
selectId: (ev: Event) => ev.id
});