Я пытаюсь сохранить все данные о студентах с помощью этой функции. Учтите, что у каждого учащегося есть 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 ответа
Попробуйте вот так:
this.studentsCopy = [...this.students]
Или же,
this.studentsCopy = this.students.map(object => ({ ...object }))
Оператор распространения (...
) можно использовать для инициализации массивов и объектов из другого массива или объекта без ссылки (глубокое копирование)
Это ваша справочная проблема, вы можете решить это с помощью lodash
this.studentsCopy = _.cloneDeep(this.paginatedResponse['result']);
Похожие вопросы
Новые вопросы
html
HTML (язык гипертекстовой разметки) — это язык разметки для создания веб-страниц и другой информации, отображаемой в веб-браузере. Вопросы относительно HTML должны включать минимальный воспроизводимый пример и некоторое представление о том, чего вы пытаетесь достичь. Этот тег редко используется отдельно и часто в паре с [CSS] и [JavaScript].