angular - Angular2 NGRX/Store-visning uppdateras inte
Förlåt för ännu en fråga om Angular 2-visningsuppdatering, men jag har inte kunnat hitta ett svar i några andra svar. Jag nämner användningen av NGRX/Store här även om jag tvivlar på att det är anledningen till att vyn inte uppdateras. Märkligt nog verkar det uppdateras åtminstone en gång, men lyckas alltid ligga ett steg efter. Den senaste (nyaste) uppdateringen träder aldrig i kraft. När modellen uppdateras, uppdateras det föregående tillståndet i vyn. Det är verkligen förvirrande. Här är den relevanta koden.
Relevanta installerade paket
"@angular/common": "2.0.0-rc.5",
"@angular/compiler": "2.0.0-rc.5",
"@angular/core": "2.0.0-rc.5",
"@angular/forms": "^0.3.0",
"@angular/http": "2.0.0-rc.5",
"@angular/platform-browser": "2.0.0-rc.5",
"@angular/platform-browser-dynamic": "2.0.0-rc.5",
"@angular/router": "^3.0.0-rc.1",
"@angular/upgrade": "2.0.0-rc.5",
"@ngrx/core": "^1.0.1",
"@ngrx/store": "^2.0.1",
Min huvudappmodul
@NgModule({
imports: [
BrowserModule,
FormsModule,
RouterModule.forRoot(AppRoutes)
],
declarations: [
ConsumerApp,
AppManagement,
MyApps,
AppRegistration,
AppDetails,
],
providers: [
HTTP_PROVIDERS,
STORE_PROVIDERS,
AppManagementService,
],
bootstrap: [
ConsumerApp
]
})
export class AppModule { }
My-Apps-komponent
@Component({
selector: 'my-apps',
template: require('./templates/my-apps.html')
})
export class MyApps implements OnInit, OnDestroy {
apps = {};
change = 1;
userAppsSubscription;
constructor (
private appsService: AppManagementService,
private store: Store<any> ) {}
ngOnInit () {
this.userAppsSubscription = this.store
.select('userApps')
.subscribe( userApps => {
this.apps = Object.assign(this.apps, userApps);
this.change++;
console.log(this);
})
this.appsService.getUserApps();
}
ngOnDestroy () {
this.userAppsSubscription.unsubscribe();
}
}
My-Apps-mall
<div id="my-apps">
<h1>My Apps</h1>
<h2>{{change}}</h2>
<p>You currently don't have any registered applications. Click "Register an App" to get started.</p>
<p [hidden]="!loading">{{apps | json}}</p>
<div class="apps-container">
<div class="col-md-4 col-sm-6" *ngFor="let app of apps.available">
<button class="block-button">
<h3>{{app.name}}</h3>
<p><strong>Description:</strong> {{app.description}}</p>
</button>
</div>
</div>
</div>
Apphanteringstjänst
@Injectable()
export class AppManagementService {
constructor (
private http: Http,
private store: Store<any>) {}
getUserApps () {
this.store
.dispatch({
type: RETRIEVE_USER_APPS,
payload: null
})
return this.http
.get(ALL_APPS)
.toPromise()
.then(response => {
this.store
.dispatch({
type: RECIEVE_USER_APPS,
payload: response.json()
})
})
.catch(response => {
this.store
.dispatch({
type: RETRIEVAL_FAILURE_USER_APPS,
payload: null
})
});
}
}
När sidan "Mina appar" först öppnas är detta vad som skrivs ut.
Och här är det utsikten slutar.
Konstigt va? Du kan se att sidan uppdaterades med det andra tillståndet som kommunicerades från NGRX/Store men inte det slutliga tillståndet som innehåller det riktiga brödet och smöret (listan med 6 appar). Varför i all världen skulle inte vyn uppdateras korrekt?
Svar #1
Kan du posta din reducerare?
Jag skulle refaktorera detta för att inte avpaketera strömmen i Init-metoden. Använd den asynkrona pipen för att göra detta åt dig. Detta hanterar också avprenumerationen.
Något som:
HTML
<div id="my-apps">
<h1>My Apps</h1>
<h2>{{change}}</h2>
<p>You currently don't have any registered applications. Click "Register an App" to get started.</p>
<p [hidden]="!loading">{{apps | json}}</p>
<div class="apps-container">
<div class="col-md-4 col-sm-6" *ngFor="let app of ($userAppsSubscription | async).apps.available">
<button class="block-button">
<h3>{{app.name}}</h3>
<p><strong>Description:</strong> {{app.description}}</p>
</button>
</div>
</div>
</div>
TS
@Component({
selector: 'my-apps',
template: require('./templates/my-apps.html')
})
export class MyApps implements OnInit, OnDestroy {
apps = {};
change = 1;
$userAppsSubscription:Observable<string>;
constructor (
private appsService: AppManagementService,
private store: Store<any> ) {}
ngOnInit () {
this.userAppsSubscription = this.store
.select('userApps');
this.appsService.getUserApps();
}
ngOnDestroy () {
this.userAppsSubscription.unsubscribe();
}
}

