Angular 7 - obiekt się nadpisuje mimo iż tworzę nowy

Odpowiedz Nowy wątek
2019-06-05 13:42
0

Witam.
Moja aplikacja ma opcję wyboru towaru z modalowego okienka. Po kliknięciu na checkbox wywołuję tę funkcję:

  multiSelectProduct(product: any) {
    const prod = product;
    prod.twr_Ilosc = 1;
    prod.twr_Wartosc = prod.twr_Cena * prod.twr_Ilosc;
    this.selectedProducts.push(prod);
  }

Mimo, iż tworze nowy obiekt prod to dane obiektu product się nadpisują. Na skrinach widać, że przed wybraniem ilość była 2 szt., a po wybraniu 1 szt., ponieważ to logiczne, że ktoś chce jedną sztukę na start, a nie cały stan magazynowy.
Dlaczego tak się dzieje i co mogę zrobić żeby się to nie nadpisywało?

Pozostało 580 znaków

2019-06-05 13:43
2

Nie tworzysz nowego obiektu
https://stackoverflow.com/que[...]tly-clone-a-javascript-object

edytowany 1x, ostatnio: spartanPAGE, 2019-06-05 13:45

Pozostało 580 znaków

2019-06-05 13:45

W ten sposób przypisujesz obiekt razem z referencją, stąd później nadpisujesz też bazowy obiekt. Z tego co na szybko bym spróbował to tym "hackiem":

const prod= JSON.parse(JSON.stringify(product));
edytowany 1x, ostatnio: Kondziowsky, 2019-06-05 13:46
Nie polecam tego hacku, wystarczy, że będziesz miał jakąś delegate jako proprete w obiekcie i bedzie dupa blada. Nie wspomne juz o niewydajności tej metody. Aczkolwiek deepcopy to grubsza sprawa jak boiekt jest mocno nested :D z mojej strony zapoznaj sie za funkcja Object.Assing - Akihito 2019-06-05 16:43

Pozostało 580 znaków

2019-06-05 13:48
0

Jeszcze wiele nauki przede mną. Dzięki, działa elegancko

Pozostało 580 znaków

2019-06-05 14:09
2

Musisz tez pamietac o tym jaka jest roznica pomiedzy shallow copy i deep clone czyli za pomoca:

JSON.parse(JSON.stringify(product));

Robisz deep clone czyli kopiujesz tez nested object (oczywiscie same value) za pomoca Object.assign lub

const newObj = { ...oldObj }

Robisz shallow copy czyli kopiujesz tylko object ale juz nested object bede zawsze referencja

Pozostało 580 znaków

2019-06-05 14:16
0

W obiektach, na których pracuje nie ma nested objects, nie ma funkcji. Tylko property różnego typu z czego w tym przypadku nie wszystkie mi są potrzebne, ale tym się zajmę później.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0