изменение объектов, передаваемых из компонента в сервис - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь реорганизовать свой код, помещая методы общих компонентов в общую службу, однако я не уверен, почему не могу переписать свойство объекта publi c компонента, переданное службе, хотя я По-видимому, можно изменять определенные c свойства объекта.

Для уточнения c это не работает:

Компонент:

   public data: any;    

    ngOnInit(): void {
       loadData(this.data);
       console.log(this.data); // <-- returns undefined
    }

Метод обслуживания:

loadData(data) {
    data = {test:'test'};
}

ОДНАКО, если я передал объект типа {test: 'test'} службе и просто изменил его в службе (например, set data.test = 'test2'), который, кажется, работает ... компонент будет иметь измененное значение, как я и ожидал.

Мой вопрос: почему я не могу присвоить новый объект объекту, переданному службе, учитывая, что объекты предположительно передаются по ссылке? angular делает что-то для защиты свойства компонента от изменения, и если да, то может ли оно быть пропущено?

Кстати, я понимаю, что мог бы просто вернуть значение из loadData и выполнить присваивание в компоненте, однако это не помогает с более сложными методами, которые я хочу реорганизовать, в которых может быть несколько объектов, переданных службе и измененных в методе службы.

Любые идеи приветствуются.

-S. Arora

1 Ответ

1 голос
/ 05 апреля 2020

Вы все еще можете обновить данные вашего компонента. Но это будет выглядеть так:

loadData(data) {
    data.test = 'test';
}

Поскольку вы хотите переопределить только свойство объекта, этого будет достаточно. Хотя я бы добавил условие, чтобы проверить, существует ли объект, так как без проверки это вызовет ошибку. Итак, возможно:

loadData(data) {
  if (data) {
    data.test = 'test';
  }
}

Почему ваше дело не сработало, я не уверен на 100%, но это может быть потому, что вы пытаетесь назначить совершенно новый объект (новую ссылку), находясь в моем если ссылка остается прежней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...