【发布时间】:2018-08-23 01:39:39
【问题描述】:
以下组件使用服务通过 HttpClient 模块从服务器获取数据。该服务基本有效。选择单个BankAccount时,BankAccountListComponent已被销毁,并显示BankAccountEditComponent。单击保存时,会执行 BankaccountEditComponent 中的 saveBankaccount 方法(见下文)。数据被发送到服务器并(始终)存储。保存数据后,将显示 BankaccountListComponent。在 ngOnInit 中,它应该再次获取数据。
问题是 BankaccountListComponent 的 ngOnInit (总是)被执行,但数据并不总是被获取。它不是一直有效,我不知道为什么。
来自 BankaccountEditComponent:
saveBankaccount() {
this.subscription = this.route.params
.subscribe(params => {
const id = (params['id'] || '');
if (id) {
this.bankaccountService.update(id, this.bankaccount).subscribe(bankaccount => {
this.bankaccount = bankaccount;
});
} else {
this.bankaccountService.add(this.bankaccount).subscribe(bankaccount => {
this.bankaccount = bankaccount;
});
}
const relUrl = this.router.url.includes('edit') ? '../..' : '..';
this.router.navigate([relUrl], { relativeTo: this.route });
});
}
BankaccountListComponent 的全部内容:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { BankaccountService } from '../../services/bankaccount.service';
import { Bankaccount } from '../../domain/bankaccount';
@Component({
selector: 'ac-bankaccount-list',
templateUrl: './bankaccount-list.component.html',
styleUrls: ['./bankaccount-list.component.css']
})
export class BankaccountListComponent implements OnInit, OnDestroy {
bankaccounts: Bankaccount[];
bankaccountSelectedId: number;
constructor(private bankaccountService: BankaccountService) { }
ngOnInit() {
console.log('init BankaccountListComponent');
this.getBankaccounts();
}
ngOnDestroy() {
console.log('destroying BankaccountListComponent');
}
getBankaccounts() {
this.bankaccountService.getBankaccounts().subscribe(bankaccounts => {
this.bankaccounts = bankaccounts;
console.log('this.bankaccount: ' + Array.prototype.map.call(this.bankaccounts, function(bankaccount) { return bankaccount.name; }).join(", "));
});
}
selectBankaccount(bankaccountId: number) {
this.bankaccountSelectedId = bankaccountId;
console.log('id of bankaccount selected: ' + this.bankaccountSelectedId);
}
deleteBankaccount(bankaccountId: number) {
console.log('id of bankaccount to delete: ' + bankaccountId);
this.bankaccountService.delete(bankaccountId).subscribe(_ => {
this.getBankaccounts();
});
}
}
所有 BankaccountService:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import 'rxjs/add/operator/map';
import { Bankaccount } from '../domain/bankaccount';
@Injectable()
export class BankaccountService {
private headers = new HttpHeaders();
private bankaccountsUrl = 'http://localhost:8090/account/accounts/';
constructor(private httpClient: HttpClient) {
this.headers = this.headers.set('Content-Type', 'application/json');
this.headers = this.headers.set('Accept', 'application/json');
}
getBankaccounts(): Observable<Bankaccount[]> {
return this.httpClient.get<Bankaccount[]>(this.bankaccountsUrl).map((result: any) => {
console.log('fetched ' + result._embedded.accounts.length + ' bankaccounts from server');
return result._embedded.accounts;
});
}
getBankaccount(id: number): Observable<Bankaccount> {
return this.httpClient.get<Bankaccount>(this.bankaccountsUrl + id).map((result: any) => {
console.log('fetched bankaccount with id ' + result.id + ' from server');
return result;
});
}
update(id: number, bankaccount: any): Observable<Bankaccount> {
return this.httpClient.put<Bankaccount>(this.bankaccountsUrl + id, bankaccount);
}
add(bankaccount: Bankaccount): Observable<Bankaccount> {
return this.httpClient.post<Bankaccount>(this.bankaccountsUrl, bankaccount);
}
delete(id: number): Observable<Bankaccount> {
console.log('will delete bankaccount ' + this.bankaccountsUrl + id);
return this.httpClient.delete<Bankaccount>(this.bankaccountsUrl + id);
}
}
【问题讨论】:
-
我可以看到您正在嵌套可观察订阅,这不是一个好习惯。不过,不确定它是否与您的问题有关
-
您是否使用 *ngFor 来显示数据?您是否已经尝试在
this.bankaccounts = bankaccounts;下放置console.log()以可视化this.bankaccounts中的数据? -
@Lorenzo 是的,我正在使用 *ngFor。 getBankaccounts()方法中已经有console.log语句了!?
-
@Pac0 不知道我该如何改变它仍然可以工作!?
-
@Mfried 有时会记录一些东西,有时会不正确?
标签: angular typescript rxjs