typescript - Angular 6 legge til elementer i Observable


Jeg er ny på Angular 6 og har problemer med hvordan jeg kan legge til objekter i en observable i en tjeneste.

jeg har dette observable

 getContacts(){
  return this.contact = 
  this.http.get('https://jsonplaceholder.typicode.com/users');
 }

og jeg trenger å legge til et element i den observerbare gjennom en annen funksjon

addContact(item){
 //observable insertion goes here.
}

Her er min fullstendige servicekode

export class ContactService {

contact;
details;

constructor(private http: HttpClient) {}

getContacts(){
 return this.contact = 
 this.http.get('https://jsonplaceholder.typicode.com/users');
}

addContact(contactName: string, contactPhone: string){

}

}

Svar #1

Hvis this.contacts er en Observable av en liste med objekter (contacts: Observable<Items[]>) og du ønsker å gjøre noen endringer i den listen, kan du enkelt bruke tap:

import { tap } from 'rxjs/operators';

this.contacts.pipe(tap(usersList => {
  usersList.push(newItem);
}));

Men hvis du vil sende en ny forespørsel til serveren og slå sammen disse listene, kan du bruke merge:

import { merge } from 'rxjs';

merge(
  this.contacts,
  this.http.get('https://jsonplaceholder.typicode.com/other_users');
).pipe(
  map(data => {
    const [currentResult, pastResult] = data;
    // ...
  }
));

Oppdatering

Basert på kommentaren din om flere detaljer, trenger du ikke gjøre noe med observables. Det du trenger er noe som dette:

I din contacts.service.ts:

getContacts(){
  return this.http.get('https://jsonplaceholder.typicode.com/users');
}

I din contacts.component.ts:

contacts: any[] = [];
ngOnInit() {
  this.contactsService.getContacts().subscribe(data => {
    this.contacts = data;
  });
}

addContact(item) {
  this.contacts.push(item);
}

Men hvis du vil ha kontaktlisten din som en Observable, bør du bruke en Subject.

I din contacts.service.ts:

contactsChange$ = new Subject<any>();
private contactsList = [];

getContacts(){
  return this.http.get('https://jsonplaceholder.typicode.com/users').pipe(tap(data => {
    this.contactsList = data;
    this.contactsChange$.next(this.contactsList);
  }));
}

addContact(item) {
  this.contactsList.push(item);
  this.contactsChange$.next(this.contactsList);
}

I din contacts.component.ts:

contacts: any[] = [];
ngOnInit() {
  this.contactsService.getContacts().subscribe(data => {this.contacts = data});
  this.contactsService.contactsChange$.subscribe(data => {this.contacts = data});
}

Svar #2

Arbeide med Observable

Til Din Tjeneste

private contactInsertedSubject = new Subject<Contact>();
contactInsertedActions$ = this.contactInsertedSubject.asObservable();

 public contacts$ = this.http.get<Contact[]>(this.contactsUrl)
            .pipe(
              // tap(data => console.log('Contacts: ', JSON.stringify(data))),
              catchError(this.handleError)
            );
public contactsWithAdd$ = merge(this.contacts$, this.contactInsertedActions$)
                        .pipe(
                          scan((acc: Product[], value: Product) => [...acc, value])
                        );
addContact(newContact?: Contact) {
   this.contactInsertedSubject.next(newContact);
}

Din kontaktskomponentklasse

contacts$ = this.contactService.contactsWithAdd$;
onAdd(): void {
   this.contactService.addProduct();
}

Når denne add-metoden kaller subject i tjenesten, vil den sende ut verdien, og merge observable har to input-observables; hvis noen av dem sender ut en verdi, vil dette bli kalt automatisk, og deretter vil map-operatoren i pipe gjøre innsettingsjobben, og contactWithAdd-observable vil ha oppdatert liste.

Relaterte artikler