Я пытаюсь сохранить все данные о студентах с помощью этой функции. Учтите, что у каждого учащегося есть name и array[] именованные отметки чисел (для простоты)

populate(){
    this.service.getAll()
    .subscribe(response=>{
      this.paginatedResponse = response
      this.students = this.paginatedResponse['result']
      this.studentsCopy = this.paginatedResponse['result']
    })
  }

Рассмотрим общее количество вариантов от 1 до 10 Поэтому я использую multi-select dropdown (пользовательский компонент) и добавляю ngModel следующим образом: рассмотреть в TS я сделал словарь вид массива с

 options=[{id:1,text:"one",..... till 10]
<ng-container *ngFor="let student of students;let i = index">
<custom-multiselect
  [items]="options"
  [(ngModel)]="students[i].marks"
  (ngModelChange)="onSelection(i)"
  optionsKey="text"
  optionsValue="id"
></custom-multiselect>
</ng-container>

И у меня есть onSelection для вывода обоих this.students.marks, this.studentsCopy.marks

Итак, вначале, пусть ученик 1 имеет имя: «Адам», отмечает: [1,2,3] Нагрузка мультиселекции изначально показывает выделенную 1,2,3, поскольку привязка ngModel выполнена, так как я выбираю для него отметку: 4 затем для this.students.marks, которое он показывает, name: "Adam", marks: [1,2,3,4], что вполне приемлемо, но почему this.studentsCopy.marks также показывает то же самое, ngModel подключен к оригинальные данные, а не право на копирование?

[РЕДАКТИРОВАТЬ]: для этого,

    console.log(this.routeCopy[index].roles)
    console.log(this.routeCopy[index].roles instanceof Array)
    this.routeCopy[index].roles = this.routeCopy[index].roles.push(333)
    console.log(this.routeCopy[index].roles)

Я получил (2) [2, 1]

[2] который открыл, говорит, 0: 2 1: 333

True 2 -> не массив вместо числа

Так что в следующий раз при выборе он говорит, что push не является функцией, поскольку он был преобразован в число? почему экземпляр массива после нажатия стал числом?

2
Srinivas Jayaram 25 Окт 2019 в 10:18

2 ответа

Лучший ответ

Попробуйте вот так:

this.studentsCopy = [...this.students]

Или же,

this.studentsCopy = this.students.map(object => ({ ...object }))

Оператор распространения (...) можно использовать для инициализации массивов и объектов из другого массива или объекта без ссылки (глубокое копирование)

3
Adrita Sharma 25 Окт 2019 в 07:23

Это ваша справочная проблема, вы можете решить это с помощью lodash

this.studentsCopy = _.cloneDeep(this.paginatedResponse['result']);
0
Ankur Patel 25 Окт 2019 в 07:31