Angular 7 HttpClient POST and GETAngular/bootstrap radio button directiveAngular UI Bootstrap Modal...
Is there a RAID 0 Equivalent for RAM?
What does chmod -u do?
Python scanner for the first free port in a range
copy and scale one figure (wheel)
The probability of Bus A arriving before Bus B
If a character has darkvision, can they see through an area of nonmagical darkness filled with lightly obscuring gas?
Removing files under particular conditions (number of files, file age)
Aragorn's "guise" in the Orthanc Stone
Are Captain Marvel's powers affected by Thanos' actions in Infinity War
Is it improper etiquette to ask your opponent what his/her rating is before the game?
Added a new user on Ubuntu, set password not working?
What is going wrong in this circuit which supposedly should step down AC to arduino friendly voltage?
What is Cash Advance APR?
Why can Carol Danvers change her suit colours in the first place?
Is preaching recommended or mandatory to a temple priest?
Is it better practice to read straight from sheet music rather than memorize it?
Electoral considerations aside, what are potential benefits, for the US, of policy changes proposed by the tweet recognizing Golan annexation?
Can disgust be a key component of horror?
Sklearn 'Seed' Not Working Properly In a Section of Code
Why is it that I can sometimes guess the next note?
Are the IPv6 address space and IPv4 address space completely disjoint?
How could a planet have erratic days?
Melting point of aspirin, contradicting sources
Are paving bricks differently sized for sand bedding vs mortar bedding?
Angular 7 HttpClient POST and GET
Angular/bootstrap radio button directiveAngular UI Bootstrap Modal scopeAngular 2 sortable listsAngular UI Datepicker Popup with Default TimeAngular4 MultiSelect ComponentPOST to endpoint and GET data backAngular 5: Writing clean component that includes services & popupsAngular service for fetching and passing data with observablesAngular async pipe with loading spinner and manual refreshAngular HTTP POST with Basic Auth and Form Data
$begingroup$
I have googled and read many tutorials about fetching data and posting data to Rest API. But i have never seen a tutorial with how to handle the getting of new data after a POST or an PUT in a best practice way. So i experimented a bit and codes this. It is working but I don't know if it is the correct way of doing this.
In customerservice
I have a subject that components can subscribe to. When I'm getting customers from the API I'm publishing the result into the subject. And in the component I'm subscribing to a customer subject.
In a POST to the API I'm triggering a GetCustomer()
to fetch all customers again.
CustomerService
import { Injectable } from '@angular/core';
import { LoggerService } from 'src/app/core/services/logger.service';
import { Observable, Subject } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { HttpClient } from '@angular/common/http';
import { tap, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CustomersService {
customers = new Subject<Customer[]>();
constructor(private http: HttpClient, private logger: LoggerService) { }
getCustomers(): void {
this.http.get<Customer[]>('/subscribers/customers').pipe(map(res => {
this.logger.info('Getting customers', res);
this.customers.next(res);
})).subscribe();
}
addCustomer(customer: Customer): void {
this.http.post<Customer[]>('/subscribers/customers', customer).pipe(map(res => {
this.logger.info('Adding new customer', res);
this.getCustomers();
})).subscribe();
}
}
CustomerComponent
import { Component, OnInit } from '@angular/core';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
import { CustomerDialogComponent } from '../../components/customer-dialog/customer-dialog.component';
import { CustomersService } from '../../services/customers.service';
import { Observable } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { LoadingWrapper } from 'src/app/shared/helpers/LoadingWrapper';
@Component({
selector: 'app-customers',
templateUrl: './customers.component.html',
styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {
bsModalRef: BsModalRef;
customers: LoadingWrapper<Customer[]>;
constructor(private modalService: BsModalService, private customersService: CustomersService) { }
ngOnInit() {
this.customers = new LoadingWrapper(this.customersService.customers);
this.customersService.getCustomers();
}
open(): void {
this.bsModalRef = this.modalService.show(CustomerDialogComponent, { backdrop: false, class: 'right-modal' });
}
}
And finally my modals that's POST a new customer:
import { Component, OnInit } from '@angular/core';
import { FormGroup, Validators } from '@angular/forms';
import { FormInputBase } from 'src/app/shared/models/form-input-base.model';
import { LoggerService } from 'src/app/core/services/logger.service';
import { FormInputText } from 'src/app/shared/models/form-input-text.model';
import { FormService } from 'src/app/core/services/form.service';
import { BsModalService } from 'ngx-bootstrap';
import { CustomersService } from '../../services/customers.service';
@Component({
selector: 'app-add-customer',
templateUrl: './add-customer.component.html',
styleUrls: ['./add-customer.component.scss']
})
export class AddCustomerComponent implements OnInit {
addCustomerForm: FormGroup;
addCustomerInputs: FormInputBase<any>[];
constructor(private logger: LoggerService, private formService: FormService,
private modalService: BsModalService, private customerService: CustomersService) { }
ngOnInit() {
this.addCustomerInputs = this.getCustomerInputs();
this.addCustomerForm = this.formService.toFormGroup(this.addCustomerInputs);
}
getCustomerInputs(): FormInputBase<any>[] {
const inputs: FormInputBase<any>[] = [
new FormInputText({
key: 'name',
label: 'Name',
placeholder: 'Customer name',
order: 1,
validation: [Validators.required, Validators.maxLength(200)]
}),
new FormInputText({
key: 'ref',
label: 'Ref',
placeholder: 'External reference',
order: 2
})
];
return inputs.sort((a, b) => a.order - b.order);
}
add(): void {
this.customerService.addCustomer(this.addCustomerForm.value);
}
close(): void {
this.modalService.hide(1);
}
}
EDIT:
LoadingWrapper
import { Subject, Observable, of } from 'rxjs';
import { shareReplay, catchError } from 'rxjs/operators';
import { LoggerService } from 'src/app/core/services/logger.service';
export class LoadingWrapper<T> {
private readonly _errorLoading$ = new Subject<boolean>();
readonly errorLoading$: Observable<boolean> = this._errorLoading$.pipe(
shareReplay(1)
);
readonly data$: Observable<{} | T>;
constructor(data: Observable<T>) {
this.data$ = data.pipe(
shareReplay(1),
catchError(error => {
this._errorLoading$.next(true);
return of();
})
);
}
}
javascript angular-2+ angular-bootstrap
$endgroup$
add a comment |
$begingroup$
I have googled and read many tutorials about fetching data and posting data to Rest API. But i have never seen a tutorial with how to handle the getting of new data after a POST or an PUT in a best practice way. So i experimented a bit and codes this. It is working but I don't know if it is the correct way of doing this.
In customerservice
I have a subject that components can subscribe to. When I'm getting customers from the API I'm publishing the result into the subject. And in the component I'm subscribing to a customer subject.
In a POST to the API I'm triggering a GetCustomer()
to fetch all customers again.
CustomerService
import { Injectable } from '@angular/core';
import { LoggerService } from 'src/app/core/services/logger.service';
import { Observable, Subject } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { HttpClient } from '@angular/common/http';
import { tap, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CustomersService {
customers = new Subject<Customer[]>();
constructor(private http: HttpClient, private logger: LoggerService) { }
getCustomers(): void {
this.http.get<Customer[]>('/subscribers/customers').pipe(map(res => {
this.logger.info('Getting customers', res);
this.customers.next(res);
})).subscribe();
}
addCustomer(customer: Customer): void {
this.http.post<Customer[]>('/subscribers/customers', customer).pipe(map(res => {
this.logger.info('Adding new customer', res);
this.getCustomers();
})).subscribe();
}
}
CustomerComponent
import { Component, OnInit } from '@angular/core';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
import { CustomerDialogComponent } from '../../components/customer-dialog/customer-dialog.component';
import { CustomersService } from '../../services/customers.service';
import { Observable } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { LoadingWrapper } from 'src/app/shared/helpers/LoadingWrapper';
@Component({
selector: 'app-customers',
templateUrl: './customers.component.html',
styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {
bsModalRef: BsModalRef;
customers: LoadingWrapper<Customer[]>;
constructor(private modalService: BsModalService, private customersService: CustomersService) { }
ngOnInit() {
this.customers = new LoadingWrapper(this.customersService.customers);
this.customersService.getCustomers();
}
open(): void {
this.bsModalRef = this.modalService.show(CustomerDialogComponent, { backdrop: false, class: 'right-modal' });
}
}
And finally my modals that's POST a new customer:
import { Component, OnInit } from '@angular/core';
import { FormGroup, Validators } from '@angular/forms';
import { FormInputBase } from 'src/app/shared/models/form-input-base.model';
import { LoggerService } from 'src/app/core/services/logger.service';
import { FormInputText } from 'src/app/shared/models/form-input-text.model';
import { FormService } from 'src/app/core/services/form.service';
import { BsModalService } from 'ngx-bootstrap';
import { CustomersService } from '../../services/customers.service';
@Component({
selector: 'app-add-customer',
templateUrl: './add-customer.component.html',
styleUrls: ['./add-customer.component.scss']
})
export class AddCustomerComponent implements OnInit {
addCustomerForm: FormGroup;
addCustomerInputs: FormInputBase<any>[];
constructor(private logger: LoggerService, private formService: FormService,
private modalService: BsModalService, private customerService: CustomersService) { }
ngOnInit() {
this.addCustomerInputs = this.getCustomerInputs();
this.addCustomerForm = this.formService.toFormGroup(this.addCustomerInputs);
}
getCustomerInputs(): FormInputBase<any>[] {
const inputs: FormInputBase<any>[] = [
new FormInputText({
key: 'name',
label: 'Name',
placeholder: 'Customer name',
order: 1,
validation: [Validators.required, Validators.maxLength(200)]
}),
new FormInputText({
key: 'ref',
label: 'Ref',
placeholder: 'External reference',
order: 2
})
];
return inputs.sort((a, b) => a.order - b.order);
}
add(): void {
this.customerService.addCustomer(this.addCustomerForm.value);
}
close(): void {
this.modalService.hide(1);
}
}
EDIT:
LoadingWrapper
import { Subject, Observable, of } from 'rxjs';
import { shareReplay, catchError } from 'rxjs/operators';
import { LoggerService } from 'src/app/core/services/logger.service';
export class LoadingWrapper<T> {
private readonly _errorLoading$ = new Subject<boolean>();
readonly errorLoading$: Observable<boolean> = this._errorLoading$.pipe(
shareReplay(1)
);
readonly data$: Observable<{} | T>;
constructor(data: Observable<T>) {
this.data$ = data.pipe(
shareReplay(1),
catchError(error => {
this._errorLoading$.next(true);
return of();
})
);
}
}
javascript angular-2+ angular-bootstrap
$endgroup$
$begingroup$
What isLoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeingLoadingWrapper
I can't tell what exactly is happening.
$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52
add a comment |
$begingroup$
I have googled and read many tutorials about fetching data and posting data to Rest API. But i have never seen a tutorial with how to handle the getting of new data after a POST or an PUT in a best practice way. So i experimented a bit and codes this. It is working but I don't know if it is the correct way of doing this.
In customerservice
I have a subject that components can subscribe to. When I'm getting customers from the API I'm publishing the result into the subject. And in the component I'm subscribing to a customer subject.
In a POST to the API I'm triggering a GetCustomer()
to fetch all customers again.
CustomerService
import { Injectable } from '@angular/core';
import { LoggerService } from 'src/app/core/services/logger.service';
import { Observable, Subject } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { HttpClient } from '@angular/common/http';
import { tap, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CustomersService {
customers = new Subject<Customer[]>();
constructor(private http: HttpClient, private logger: LoggerService) { }
getCustomers(): void {
this.http.get<Customer[]>('/subscribers/customers').pipe(map(res => {
this.logger.info('Getting customers', res);
this.customers.next(res);
})).subscribe();
}
addCustomer(customer: Customer): void {
this.http.post<Customer[]>('/subscribers/customers', customer).pipe(map(res => {
this.logger.info('Adding new customer', res);
this.getCustomers();
})).subscribe();
}
}
CustomerComponent
import { Component, OnInit } from '@angular/core';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
import { CustomerDialogComponent } from '../../components/customer-dialog/customer-dialog.component';
import { CustomersService } from '../../services/customers.service';
import { Observable } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { LoadingWrapper } from 'src/app/shared/helpers/LoadingWrapper';
@Component({
selector: 'app-customers',
templateUrl: './customers.component.html',
styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {
bsModalRef: BsModalRef;
customers: LoadingWrapper<Customer[]>;
constructor(private modalService: BsModalService, private customersService: CustomersService) { }
ngOnInit() {
this.customers = new LoadingWrapper(this.customersService.customers);
this.customersService.getCustomers();
}
open(): void {
this.bsModalRef = this.modalService.show(CustomerDialogComponent, { backdrop: false, class: 'right-modal' });
}
}
And finally my modals that's POST a new customer:
import { Component, OnInit } from '@angular/core';
import { FormGroup, Validators } from '@angular/forms';
import { FormInputBase } from 'src/app/shared/models/form-input-base.model';
import { LoggerService } from 'src/app/core/services/logger.service';
import { FormInputText } from 'src/app/shared/models/form-input-text.model';
import { FormService } from 'src/app/core/services/form.service';
import { BsModalService } from 'ngx-bootstrap';
import { CustomersService } from '../../services/customers.service';
@Component({
selector: 'app-add-customer',
templateUrl: './add-customer.component.html',
styleUrls: ['./add-customer.component.scss']
})
export class AddCustomerComponent implements OnInit {
addCustomerForm: FormGroup;
addCustomerInputs: FormInputBase<any>[];
constructor(private logger: LoggerService, private formService: FormService,
private modalService: BsModalService, private customerService: CustomersService) { }
ngOnInit() {
this.addCustomerInputs = this.getCustomerInputs();
this.addCustomerForm = this.formService.toFormGroup(this.addCustomerInputs);
}
getCustomerInputs(): FormInputBase<any>[] {
const inputs: FormInputBase<any>[] = [
new FormInputText({
key: 'name',
label: 'Name',
placeholder: 'Customer name',
order: 1,
validation: [Validators.required, Validators.maxLength(200)]
}),
new FormInputText({
key: 'ref',
label: 'Ref',
placeholder: 'External reference',
order: 2
})
];
return inputs.sort((a, b) => a.order - b.order);
}
add(): void {
this.customerService.addCustomer(this.addCustomerForm.value);
}
close(): void {
this.modalService.hide(1);
}
}
EDIT:
LoadingWrapper
import { Subject, Observable, of } from 'rxjs';
import { shareReplay, catchError } from 'rxjs/operators';
import { LoggerService } from 'src/app/core/services/logger.service';
export class LoadingWrapper<T> {
private readonly _errorLoading$ = new Subject<boolean>();
readonly errorLoading$: Observable<boolean> = this._errorLoading$.pipe(
shareReplay(1)
);
readonly data$: Observable<{} | T>;
constructor(data: Observable<T>) {
this.data$ = data.pipe(
shareReplay(1),
catchError(error => {
this._errorLoading$.next(true);
return of();
})
);
}
}
javascript angular-2+ angular-bootstrap
$endgroup$
I have googled and read many tutorials about fetching data and posting data to Rest API. But i have never seen a tutorial with how to handle the getting of new data after a POST or an PUT in a best practice way. So i experimented a bit and codes this. It is working but I don't know if it is the correct way of doing this.
In customerservice
I have a subject that components can subscribe to. When I'm getting customers from the API I'm publishing the result into the subject. And in the component I'm subscribing to a customer subject.
In a POST to the API I'm triggering a GetCustomer()
to fetch all customers again.
CustomerService
import { Injectable } from '@angular/core';
import { LoggerService } from 'src/app/core/services/logger.service';
import { Observable, Subject } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { HttpClient } from '@angular/common/http';
import { tap, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class CustomersService {
customers = new Subject<Customer[]>();
constructor(private http: HttpClient, private logger: LoggerService) { }
getCustomers(): void {
this.http.get<Customer[]>('/subscribers/customers').pipe(map(res => {
this.logger.info('Getting customers', res);
this.customers.next(res);
})).subscribe();
}
addCustomer(customer: Customer): void {
this.http.post<Customer[]>('/subscribers/customers', customer).pipe(map(res => {
this.logger.info('Adding new customer', res);
this.getCustomers();
})).subscribe();
}
}
CustomerComponent
import { Component, OnInit } from '@angular/core';
import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
import { CustomerDialogComponent } from '../../components/customer-dialog/customer-dialog.component';
import { CustomersService } from '../../services/customers.service';
import { Observable } from 'rxjs';
import { Customer } from 'src/app/shared/models/customer.model';
import { LoadingWrapper } from 'src/app/shared/helpers/LoadingWrapper';
@Component({
selector: 'app-customers',
templateUrl: './customers.component.html',
styleUrls: ['./customers.component.scss']
})
export class CustomersComponent implements OnInit {
bsModalRef: BsModalRef;
customers: LoadingWrapper<Customer[]>;
constructor(private modalService: BsModalService, private customersService: CustomersService) { }
ngOnInit() {
this.customers = new LoadingWrapper(this.customersService.customers);
this.customersService.getCustomers();
}
open(): void {
this.bsModalRef = this.modalService.show(CustomerDialogComponent, { backdrop: false, class: 'right-modal' });
}
}
And finally my modals that's POST a new customer:
import { Component, OnInit } from '@angular/core';
import { FormGroup, Validators } from '@angular/forms';
import { FormInputBase } from 'src/app/shared/models/form-input-base.model';
import { LoggerService } from 'src/app/core/services/logger.service';
import { FormInputText } from 'src/app/shared/models/form-input-text.model';
import { FormService } from 'src/app/core/services/form.service';
import { BsModalService } from 'ngx-bootstrap';
import { CustomersService } from '../../services/customers.service';
@Component({
selector: 'app-add-customer',
templateUrl: './add-customer.component.html',
styleUrls: ['./add-customer.component.scss']
})
export class AddCustomerComponent implements OnInit {
addCustomerForm: FormGroup;
addCustomerInputs: FormInputBase<any>[];
constructor(private logger: LoggerService, private formService: FormService,
private modalService: BsModalService, private customerService: CustomersService) { }
ngOnInit() {
this.addCustomerInputs = this.getCustomerInputs();
this.addCustomerForm = this.formService.toFormGroup(this.addCustomerInputs);
}
getCustomerInputs(): FormInputBase<any>[] {
const inputs: FormInputBase<any>[] = [
new FormInputText({
key: 'name',
label: 'Name',
placeholder: 'Customer name',
order: 1,
validation: [Validators.required, Validators.maxLength(200)]
}),
new FormInputText({
key: 'ref',
label: 'Ref',
placeholder: 'External reference',
order: 2
})
];
return inputs.sort((a, b) => a.order - b.order);
}
add(): void {
this.customerService.addCustomer(this.addCustomerForm.value);
}
close(): void {
this.modalService.hide(1);
}
}
EDIT:
LoadingWrapper
import { Subject, Observable, of } from 'rxjs';
import { shareReplay, catchError } from 'rxjs/operators';
import { LoggerService } from 'src/app/core/services/logger.service';
export class LoadingWrapper<T> {
private readonly _errorLoading$ = new Subject<boolean>();
readonly errorLoading$: Observable<boolean> = this._errorLoading$.pipe(
shareReplay(1)
);
readonly data$: Observable<{} | T>;
constructor(data: Observable<T>) {
this.data$ = data.pipe(
shareReplay(1),
catchError(error => {
this._errorLoading$.next(true);
return of();
})
);
}
}
javascript angular-2+ angular-bootstrap
javascript angular-2+ angular-bootstrap
edited Mar 17 at 20:52
Tan
asked Mar 15 at 21:10
TanTan
1063
1063
$begingroup$
What isLoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeingLoadingWrapper
I can't tell what exactly is happening.
$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52
add a comment |
$begingroup$
What isLoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeingLoadingWrapper
I can't tell what exactly is happening.
$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52
$begingroup$
What is
LoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeing LoadingWrapper
I can't tell what exactly is happening.$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
What is
LoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeing LoadingWrapper
I can't tell what exactly is happening.$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215533%2fangular-7-httpclient-post-and-get%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215533%2fangular-7-httpclient-post-and-get%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
What is
LoadingWrapper
? The way you're using observables in your service seems like an antipattern, but without seeingLoadingWrapper
I can't tell what exactly is happening.$endgroup$
– elclanrs
Mar 17 at 20:37
$begingroup$
@elclanrs Loading wrapper is just a generic way to handle errors and showing the loading text.
$endgroup$
– Tan
Mar 17 at 20:52