Opracowuję wielokrotnie rozwijany rozwijanie w kątach, który również szukał. Wtedy analizuję wejście podane z pola wejściowego za pośrednictwem moich danych głównych i wyświetlanie tylko filtrowanej zawartości w Domu. To moja funkcja:

modifyFilter(value: any) {
        console.log('value', value); //The value passed from DOM
        this.filterContent = this.catalogManufacturerNames; /******/
        for(let i=0; i<this.catalogManufacturerNames.length;i++) {
         /* Search catalogManufacturerNames for the value and splice all
         filterContent not having the matching value */    
        }
    }

Problem z kodem jest to, że za każdym razem, gdy metoda modifyFilter nazywana jest również catalogManufacturerNames jest również zmieniona wraz z filterContent. Więc za każdym razem, gdy dzwonię modifyFilter, wiersz oznaczony przez / ****** / The filterContent zostanie przypisany do poprzedniego filterContent niż globalny i przypuszczalnie niezmieniony catalogManufacturerNames . Myślę, że problem jest taki, że filterContent i catalogManufacturerNames i catalogManufacturerNames Uzyskaj dwa sposoby wiązane, ale nie wiem, jak modyfikować go do moich wymagań. Czy jest jakiś inny sposób na to. Sugestie są mile widziane.

8
Sriram Jayaraman 28 czerwiec 2017, 09:24

3 odpowiedzi

Najlepsza odpowiedź

W tym przypadku musisz użyć obiekt.Asign lub Deepcopy . Utworzy kopię swojego obiektu / zmiennej, więc gdy kiedykolwiek wykonasz jakiś filtr na pierwotnym obiekcie, nie będzie odzwierciedlał w skopiowanym obiekcie i odwrotnie.

Możesz użyć {},[] zgodnie z wymaganiami.

{}: dla pojedynczego obiektu

[]: do zbierania obiektów

let copiedItem = Object.assign({}, copiedItem , PrimaryItem );

Proszę odnieść się do szczegółów: HTTPS: //developer.mozilla .org / EN / DOCS / WWW / JavaScript / Reference / Global_Objects / Obiekt / Przypisz

Opcja: 2 Głęboka kopia

DeepCopy(obj: any): any {
  let clonedObject;

  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  if (obj instanceof Array) {
    clonedObject = [];
    for (let i = 0; i < obj.length; i++) {
      clonedObject[i] = this.deepCopy(obj[i]);
    }
    return clonedObject;
  }
  if (obj instanceof Date) {
    clonedObject = new Date(obj.valueOf());
    return clonedObject;
  }
  if (obj instanceof RegExp) {
    clonedObject = RegExp(obj.source, obj.flags);
    return clonedObject;
  }
  if (obj instanceof Object) {
    clonedObject = new obj.constructor();
    for (const attr in obj) {
      if (obj.hasOwnProperty(attr)) {
        clonedObject[attr] = this.deepCopy(obj[attr]);
      }
    }
    return clonedObject;
  }
}

Zadzwoń ze składnika

let copiedItem: any[] = this.DeepCopy(PrimaryItem );
15
Sandip - Full Stack Developer 18 październik 2019, 12:23

Przypuśćmy, że jeśli masz zmienną o nazwie "A" o wartości "Apple" i zmienna zwana "B", do którego chcesz przypisać wartość "A" i nie chcesz, aby żadna przyszła zmiana "B" wpływa na "A" Następnie użyj poniższego kodu

Var b = obiekt.Asign (a); // Spowoduje to zatrzymanie dwukierunkowego wiązania, co oznacza każdą zmianę B, nie ma wpływu na

0
Dila Gurung 21 marzec 2018, 05:36

Jako prostsza alternatywa dla przy użyciu Object.assign można użyć operatora Spread, aby skopiować właściwości obiektu podwójnego związanego z innym:

this.filterContent = {...this.catalogManufacturerNames};


.. Odniesienie: http://redx.js.org/docs/recipes/usingObjectsPreadoperator.html.

2
Jamie Kudla 14 sierpień 2017, 18:14