执行 POST 操作后刷新组件
To refresh the component after performing POST operation
我有一个名为 customers-list
的组件,我在其中显示来自 API 的所有客户:
客户-list.html
<div *ngFor="let customer of customers">
<p>{{customer.name}</p>
</div>
客户-list.ts
import { Component Input} from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { CustomersService } from 'src/app/services/customers.service';
@Component({
selector: 'drt-customers-list',
templateUrl: './customers-list.component.html',
styleUrls: ['./customers-list.component.scss'],
})
export class CustomerListComponent {
public customers: ICustomer[] ;
constructor(public customersService: CustomersService,) {}
public async ngOnInit(): Promise<void> {
this.customers = await this.customersService.getCustomersList('');
}
}
我有另一个名为 add-customer
的组件,我将在其中添加新客户,如下所示:
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
this.successMessage();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}
现在 POST
操作正常,但是 customer-list
在不刷新页面的情况下不会更新。
如何在 POST
操作成功后更新 customers-list
组件,而不刷新整个页面?
服务文件:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CustomersService {
private baseUrl : string = '....api URL....';
public async getCustomersList(): Promise<ICustomer[]> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.get<ICustomer[]>(apiUrl).toPromise();
}
public addCustomer(customer: ICustomer): Observable<object> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.post(apiUrl, customer);
}
}
ngOnInit
只运行一次。您已在 ngOnInit
中分配了 customers 变量。因此,它仅在刷新时更新。每次请求完成都需要给this.customers
赋值。
constructor(public customersService: CustomersService, private cd: ChangeDetectorRef) {}
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
this.customers = await this.customersService.getCustomersList('');
console.log(this.customers) //are you getting updating list here without refreshing.
this.cd.markForCheck();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}
不刷新的主要原因是ngOnIniit只在初始化的时候执行。我假设您没有使用任何状态管理库(数据存储),因此最好的解决方案是在 CustomerService 中使用 Subject。这是代码,它可能无法编译,我只是用记事本快速写给你。此外,您还需要确保添加方法确实是在添加客户,而 getCustomer 方法确实是在获取新添加的客户。如果两者都有效,那么我的解决方案就可以了。
CustomerListComponent
import { Component Input} from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { CustomersService } from 'src/app/services/customers.service';
@Component({
selector: 'drt-customers-list',
templateUrl: './customers-list.component.html',
styleUrls: ['./customers-list.component.scss'],
})
export class CustomerListComponent {
public customers: ICustomer[] ;
constructor(public customersService: CustomersService,) {}
public async ngOnInit(): Promise<void> {
this.initCustomerAddedSubscription();
}
/**
* This subscription will execute every single time whenever a customer is added successfully
*
*/
public initCustomerAddedSubscription() {
this.customersService.customerAdded.subscribe((data: boolean) => {
if(data) {
this.customers = await this.customersService.getCustomersList('');
}
});
}
}
客户服务
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CustomersService {
private baseUrl : string = '....api URL....';
// use this subject in onAddCustomer method
public customerAdded: Subject<boolean>;
// constructor to initialize subject
constructor() {
this.customerAdded = new Subject<boolean>();
}
public async getCustomersList(): Promise<ICustomer[]> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.get<ICustomer[]>(apiUrl).toPromise();
}
public addCustomer(customer: ICustomer): Observable<object> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.post(apiUrl, customer);
}
}
onaddCustomer 方法
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
// You can pass in the newly added customer as well if you want for any reason. boolean is fine for now.
this.customersService.customerAdded.next(true);
this.successMessage();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}
我有一个名为 customers-list
的组件,我在其中显示来自 API 的所有客户:
客户-list.html
<div *ngFor="let customer of customers">
<p>{{customer.name}</p>
</div>
客户-list.ts
import { Component Input} from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { CustomersService } from 'src/app/services/customers.service';
@Component({
selector: 'drt-customers-list',
templateUrl: './customers-list.component.html',
styleUrls: ['./customers-list.component.scss'],
})
export class CustomerListComponent {
public customers: ICustomer[] ;
constructor(public customersService: CustomersService,) {}
public async ngOnInit(): Promise<void> {
this.customers = await this.customersService.getCustomersList('');
}
}
我有另一个名为 add-customer
的组件,我将在其中添加新客户,如下所示:
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
this.successMessage();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}
现在 POST
操作正常,但是 customer-list
在不刷新页面的情况下不会更新。
如何在 POST
操作成功后更新 customers-list
组件,而不刷新整个页面?
服务文件:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CustomersService {
private baseUrl : string = '....api URL....';
public async getCustomersList(): Promise<ICustomer[]> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.get<ICustomer[]>(apiUrl).toPromise();
}
public addCustomer(customer: ICustomer): Observable<object> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.post(apiUrl, customer);
}
}
ngOnInit
只运行一次。您已在 ngOnInit
中分配了 customers 变量。因此,它仅在刷新时更新。每次请求完成都需要给this.customers
赋值。
constructor(public customersService: CustomersService, private cd: ChangeDetectorRef) {}
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
this.customers = await this.customersService.getCustomersList('');
console.log(this.customers) //are you getting updating list here without refreshing.
this.cd.markForCheck();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}
不刷新的主要原因是ngOnIniit只在初始化的时候执行。我假设您没有使用任何状态管理库(数据存储),因此最好的解决方案是在 CustomerService 中使用 Subject。这是代码,它可能无法编译,我只是用记事本快速写给你。此外,您还需要确保添加方法确实是在添加客户,而 getCustomer 方法确实是在获取新添加的客户。如果两者都有效,那么我的解决方案就可以了。
CustomerListComponent
import { Component Input} from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { CustomersService } from 'src/app/services/customers.service';
@Component({
selector: 'drt-customers-list',
templateUrl: './customers-list.component.html',
styleUrls: ['./customers-list.component.scss'],
})
export class CustomerListComponent {
public customers: ICustomer[] ;
constructor(public customersService: CustomersService,) {}
public async ngOnInit(): Promise<void> {
this.initCustomerAddedSubscription();
}
/**
* This subscription will execute every single time whenever a customer is added successfully
*
*/
public initCustomerAddedSubscription() {
this.customersService.customerAdded.subscribe((data: boolean) => {
if(data) {
this.customers = await this.customersService.getCustomersList('');
}
});
}
}
客户服务
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ICustomer} from 'src/app/models/app.models';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class CustomersService {
private baseUrl : string = '....api URL....';
// use this subject in onAddCustomer method
public customerAdded: Subject<boolean>;
// constructor to initialize subject
constructor() {
this.customerAdded = new Subject<boolean>();
}
public async getCustomersList(): Promise<ICustomer[]> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.get<ICustomer[]>(apiUrl).toPromise();
}
public addCustomer(customer: ICustomer): Observable<object> {
const apiUrl: string = `${this.baseUrl}/customers`;
return this.http.post(apiUrl, customer);
}
}
onaddCustomer 方法
public onaddCustomer(): void {
this.someCustomer = this.addCustomerForm.value;
this.customersService.addCustomer( this.someCustomer).subscribe(
() => { // If POST is success
// You can pass in the newly added customer as well if you want for any reason. boolean is fine for now.
this.customersService.customerAdded.next(true);
this.successMessage();
},
(error) => { // If POST is failed
this.failureMessage();
}
);
}