【发布时间】:2019-06-27 13:28:49
【问题描述】:
我有一项服务,其中为主题和行为主题创建了 http 请求。然后我将服务中的数据获取到 page.ts(在构造函数上)以将其显示在模板中。
我所做的代码运行良好,但问题是模板“大喊”主题的数据尚未到达。因此,如果我想用它来初始化 FORM 控件或显示数组中的数据,它会给我错误。
PS: 我尝试了一个 behaviorSubject 的主题,但我遇到了同样的问题。 :( 我确定我在做一个概念错误。
有人知道如何在模板显示之前获取数据?
感谢您的帮助
带有 Subject 和 behaviorSubject 的服务代码:
const INTI_DATA = [];
@Injectable({
providedIn: 'root'
})
export class FormStorageService {
dbSubject = new Subject<any[]>();
dbBSubject = new BehaviorSubject(INTI_DATA);
data$: Observable<any> = this.dbBSubject.asObservable();
private _URL: any = '../assets/DB-Test/data.json';
private dbData: any[] = [];
constructor(private http: HttpClient) {}
getDBDataBehavior() {
this.http.get<any[]>(this._URL).subscribe((response: any[]) => {
const value = response['DB_DATA'];
this.dbBSubject.next(value);
}, error => {
console.log('Error : ', error);
alert(error.message);
});
}
getDBData() {
this.http.get<any[]>(this._URL).subscribe((response: any[]) => {
const value = response['DB_DATA'];
this.dbSubject.next(value);
}, error => {
console.log('Error : ', error);
alert(error.message);
});
}
}
Page.TS (Form2Page) 与主题调用
export class Form2Page implements OnInit, OnDestroy {
obsSubscription: Subscription;
public dbData: DataModel[] = [];
itemsForm: FormGroup;
constructor(private storageService: FormStorageService) {
// Get data from DB
this.storageService.getDBData();
this.obsSubscription = this.storageService.dbSubject.subscribe(
(value: any[]) => {
this.dbData = value;
console.log('Value in FORM2 : ', value);
console.log('DB Data in FORM2 in subscribe : ', this.dbData);
},
error => {
console.log('erreur', error);
}
);
console.log('DB Data DB Data in FORM2 : ', this.dbData);
}
ngOnInit() {
console.log('DB Data in FORM2 in ngOnInit : ', this.dbData);
}
ngOnDestroy() {
this.obsSubscription.unsubscribe();
}
}
控制台中的结果。你可以看到dbData在一段时间后得到一些数据
DB Data DB Data in FORM2 : []
form2.page.ts:46 DB Data in FORM2 in ngOnInit : []
form2.page.ts:29 Value in FORM2 : {ITEMS: Array(1)}
form2.page.ts:30 DB Data in FORM2 in subscribe : {ITEMS: Array(1)}
Page.TS (Form3Page) 与 BehaviorSubject 调用
export class Form3Page implements OnInit {
obsBSubject$ = this.formStorage.data$;
public dbData: any[] = [];
constructor(private formStorage: FormStorageService) {
this.formStorage.getDBDataBehavior();
this.obsBSubject$.subscribe(
(value: any[]) => {
this.dbData = value;
console.log('Value in FORM3 : ', value);
console.log('DB Data in FORM3 in subscribe : ', this.dbData);
},
error => {
console.log('erreur', error);
}
);
console.log('DB Data in FORM3 : ', this.dbData);
}
ngOnInit() {
console.log('DB Data in FORM3 in ngOnInit : ', this.dbData);
}
}
控制台中的结果。你可以看到dbData在一段时间后得到一些数据
Value in FORM3 : []
form3.page.ts:19 DB Data in FORM3 in subscribe : []
form3.page.ts:25 DB Data in FORM3 : []
form3.page.ts:30 DB Data in FORM3 in ngOnInit : []
form3.page.ts:18 Value in FORM3 : {ITEMS: Array(1)}
form3.page.ts:19 DB Data in FORM3 in subscribe : {ITEMS: Array(1)}
【问题讨论】:
-
您是否尝试使用数据在表单上添加
*ngIf="data !== null && data !== undefined"? -
你为什么不订阅你的服务?
-
@kebbaben 不,我还没试过
-
@Ari Waisberg 因为我是这样从课程中学到的 :( 也许还有其他方法,但我不知道该怎么做
-
@kebbaben 你的解决方案也很好用!!!太感谢你了!!! :)
标签: angular ionic-framework behaviorsubject subject