Я разработал компонент с двумя представлениями. Компонент A имеет контактную форму, а компонент B - это страница «Спасибо».
Компонент А:
Вы заполняете форму и отправляете ее.
Как только приходит ответ, создается новое значение ReplaySubject.
Пользователь будет перенаправлен на компонент B.
Компонент B:
Компонент инициализирован.
Компонент получает значение от субъекта.
Представление отображается и отображает сообщение с благодарностью.
Ответ на HTTP-запрос (возвращается после успешного отправки запроса данных формы):
{
"status": 200,
"body": {
"message": "We have received your request with the card information below and it will take 48h to be processed. Thank you!",
"card": {
"name": "John Doe",
"email": "john.doe@gmail.com",
"accountNumber": "12345-67890"
}
},
"type": "ItemCreated"
}
Код компонента A (форма):
import { Component } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { RequestCardWidgetService } from './request-card-widget.service';
import { RouterService } from '@framework/foundation/core';
import { Item } from '@pt/request-card-data'
@Component({
selector: 'pt-request-card-form',
templateUrl: './request-card-form.template.html',
providers: [RouterService]
})
export class RequestCardFormComponent {
constructor(private fb: FormBuilder, private data: RequestCardWidgetService, private router: RouterService){}
item: Item = {
name: '',
email: '',
accountNumber: ''
};
requestCardForm = this.fb.group({
name: ['', Validators.required],
email: ['', Validators.email],
accountNumber: ['', Validators.required]
})
onSubmit() {
this.item = this.requestCardForm.value;
this.data.requestCard(this.item)
.subscribe(data => {
this.data.processResult(data);
this.router.navigate(['/success']);
});
}
}
Код компонента B (страница «Спасибо»):
import { Component } from '@angular/core';
import { RequestCardWidgetService } from './request-card-widget.service';
@Component({
selector: 'pt-request-card-success',
templateUrl: './request-card-success.template.html'
})
export class RequestCardSuccessComponent {
messages: any; // TODO: To use the proper type...
constructor( private requestCardService: RequestCardWidgetService) {
this.messages = this.requestCardService.message;
}
}
Шаблон компонента B (страница «Спасибо»):
<div *ngIf='(messages | async) as msg'>
{{ msg.message}}
</div>
Код компонента обслуживания:
import { Injectable } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs';
import { map, take } from 'rxjs/operators';
import {
RequestCardDataService,
Item,
ItemCreated
} from '@example/request-card-data';
@Injectable()
export class RequestCardWidgetService {
constructor(private dataService: RequestCardDataService) { }
private readonly results = new ReplaySubject<ItemCreated>();
readonly message: Observable<ItemCreated> = this.results; // Message Line. This is the variable that I'm rendering in the template. Is this the correct way of extracting subject values?
requestCard (card: Item): Observable<ItemCreated> {
return this.dataService.postCardRecord(card).pipe(
take(1),
map((response: HttpResponse<ItemCreated>): ItemCreated | {} => {
return response.body
? response.body
: {};
})
);
}
processResult(data: ItemCreated) {
this.results.next(data);
}
}
Резюме:
Компонент А имеет форму. После отправки формы результаты сохраняются как новое значение в теме. Пользователь перенаправляется на страницу благодарности.
Компонент страницы с благодарностью отображает элемент и получает новейшее значение от темы. Затем он отображает содержимое.
Этот код работает, но у меня есть несколько вопросов.
Вопрос:
Это правильный способ использования субъекта?
Это:
readonly message: Observable<ItemCreated> = this.results;
правильный способ извлечения значений из предмета? (Я передаю «сообщение» представлению.)
Есть ли лучшие способы достижения того же результата?
Заранее большое спасибо.