Добавление объекта во вложенный массив

#typescript #angular12

Вопрос:

Я работаю над проектом Angular 12, в котором мне нужно добавлять и удалять данные из существующего набора данных.

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

Ситуация: У меня есть кнопки для добавления пользователя в массив пользователей и добавления пароля в массив паролей пользователя.

Требование: 1. Когда я нажимаю Добавить пользователя, он добавляет пользователя в массив пользователей (работает нормально) 2. Когда я нажимаю Добавить пароль у 1-го пользователя (пользователь с индексом 0), он должен добавить пароль только у пользователя с индексом 0 (Не работает)

Проблема: Когда я нажимаю Добавить пароль у 1-го пользователя (пользователь с индексом 0, addPassword(0)), он добавляет пароль всем пользователям независимо от индекса.

Пожалуйста, ознакомьтесь с приведенным ниже кодом и помогите мне выяснить, чего мне здесь не хватает.

Заранее спасибо.

HTML Ниже

 <p>{{ portal | json }}</p>

<hr>
<hr>
<a (click)="addUsername()">Add User</a><br>

<hr>
<a (click)="addPassword(0)">Add Password in 1st user</a><br>

<hr>
<a (click)="addPassword(1)">Add Password in 2nd user</a><br>
 

TS ниже

 const emptyPassword = {
  "password": '',
  "id": 0
};

const emptyPortalUser = {
  "username": '',
  "id": 0,
  "passwords": [emptyPassword]
};

@Component({
  selector: 'logic-poc',
  templateUrl: './logic-poc.component.html',
  styleUrls: ['./logic-poc.component.css']
})
export class LogicPocComponent implements OnInit {

  constructor() { }

  portal = {
    "id": 0,
    "name": '',
    "users": [emptyPortalUser],
  };

  ngOnInit(): void {
    
  }

  addUsername() {
    this.portal.users.push(emptyPortalUser);
  }

  addPassword(ui: number){
    this.portal.users[ui].passwords.push(emptyPassword);    
  }

}
 

Expected Output

 {
   "id": 0,
   "name": "",
   "users": [
      {
         "username": "",
         "id": 0,
         "passwords": [
            {
               "password": "",
               "id": 0
            },
            {
               "password": "",
               "id": 0
            }
         ]
      },
      {
         "username": "",
         "id": 0,
         "passwords": [
            {
               "password": "",
               "id": 0
            }
         ]
      }
   ]
}
 

Фактический результат, который я получаю

 {
   "id": 0,
   "name": "",
   "users": [
      {
         "username": "",
         "id": 0,
         "passwords": [
            {
               "password": "",
               "id": 0
            },
            {
               "password": "",
               "id": 0
            }
         ]
      },
      {
         "username": "",
         "id": 0,
         "passwords": [
            {
               "password": "",
               "id": 0
            },
            {
               "password": "",
               "id": 0
            }
         ]
      }
   ]
}
 

Ответ №1:

Вы помещаете один и тот же объект пользователя в массив пользователей. Вам нужно нажимать разные экземпляры пользователей.

Из этого следует, что в функции addUsername() необходимо создать нового пользователя.

Комментарии:

1. Спасибо Лесиаку, это сработало. Я использовал приведенный ниже код для этого в функции addUsername() this.portal.users.push(JSON.parse(JSON.stringify(пустой порталпользователя)));

2. Это действительно сложный способ создания нового объекта. Я бы либо создал функцию makeNewEmptyUser , либо просто переместил emptyPortalUser (и emptyPassword) внутрь addUsername()