Hallo Ich habe einen PouchDB-Dienst, der einige Daten abruft und ein Versprechen mit ihm zurückgibt. Ich möchte dieses Versprechen in eine Observable konvertieren und dann in ngOnInit abonnieren, damit das Modell aktualisiert wird.Angular 4 mit subscribe, um Daten von einem Versprechen mit einer beobachtbaren Funktion zu binden
ich eine Implementierung eines Service mit einem Verfahren hergestellt, das die beobachtbare zurückkehrt, aber es funktioniert nicht (die Daten nicht auf DOM reflektiert nicht erhalten):
Component HTML:
<h1>{{title}}</h1>
<ul>
<li *ngFor="let platform of platforms">
<a href="#">{{ platform }}</a>
</li>
</ul>
Komponente TS :
import { Component, OnInit } from '@angular/core';
import { PouchDbBuilder } from './PouchDbBuilder';
import { PlatformsService } from './services/PlatformsService';
@Component({
selector: 'platforms',
templateUrl: './platforms.component.html'
})
export class PlatformsComponent implements OnInit {
title : string;
platforms: Array<string>;
private platformsService;
constructor() {
this.title = "All Platforms";
let serviceName = 'http://xxxx.net:5984/';
let pouchDbBuilder = new PouchDbBuilder(serviceName);
this.platformsService = new PlatformsService(pouchDbBuilder);
}
ngOnInit() {
this.platformsService.getPlatforms().subscribe(platforms => {
this.platforms = platforms;
});
}
}
Dienst TS:
import { Injectable } from '@angular/core';
import {PouchDbBuilder} from './PouchDbBuilder';
import {PlatformsDataProvider} from './PlatformsDataProvider';
import { Observable } from "rxjs/Observable";
@Injectable()
export class PlatformsService {
private platformsProvider;
constructor(private pouchDbBuilder: PouchDbBuilder) {
this.platformsProvider = new PlatformsDataProvider(this.pouchDbBuilder);
}
getPlatforms(): Observable<Array<string>> {
return new Observable(observer => {
this.platformsProvider.getPlatforms().then(platforms => {
observer.next(platforms);
}).catch(err => {
console.error(err);
});
});
}
}
Dies funktioniert nur, wenn ich „this.ngZone.run“ nach dem suscribe zum ngOnInit hinzuzufügen, wie folgt aus:
ngOnInit() {
this.platformsService.getPlatforms().subscribe(platforms => {
this.ngZone.run(() => {
this.platforms = platforms;
});
});
}
Aber auf diese Weise es wie Betrug ist, weil ich das Update auf DOM bin zwingen.
Kann mir jemand sagen, was ich falsch mache?
was hier ein Beutel db Builder ist, kann nicht direkt rufen Sie die HTTP-GET, die eine beobachtbare von defualt gibt –
PouchDbBuilder eine eigene Bibliothek, die ihre eigenen HTTP-Anrufe zu tätigen, Verwenden von Xhr-Bibliothek, nicht Angular http. PlatformsDataProvider macht das gleiche. – CoF