Как обновить значения в независимом компоненте в angular 2+

Я новичок в angular, мне удалось создать базовое приложение с несколькими макетами и на странице редактирования профиля, когда я обновляю данные пользователя и нажимаю сохранить, я хочу, чтобы это изменение отражалось в заголовке приложения (компонента)

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

См. https://angular-component-communication.stackblitz.io или отредактируйте https://stackblitz.com/edit/angular-component-communication

Я изначально устанавливаю некоторые значения для локального хранилища (в app.component.ts) и отображаю эти значения в заголовке (./ app / _layout / app-header /), например, имя, адрес электронной почты и т. д.

В этом примере приложения я пытаюсь изменить значение локального хранилища из полностью независимого компонента и отразить изменения в заголовке.

пожалуйста, найдите мой образец кода ниже

app.component.ts

export class AppComponent  {

  constructor(){
     //since we dont have a login in this sample code iam manually setting the localstorage values 
    const initialAuthUserData = {
          token:'init-SOMETOKENSTRINGGOESHERE',
          name:'wilson',
          email:'[email protected]',
          is_admin:1,
          avatar:'init-avatar.jpg',
          user_id:1234
      };
    localStorage.setItem('authUser', JSON.stringify(initialAuthUserData));   
  }
}

app.routing.ts

const mainRoutes: Routes = [
    {
        path: '',
        component: ApplicationLayoutComponent, 
        children: [
          { path: '', component: HomeComponent, pathMatch: 'full'}
        ]
    },
    { path: '**', redirectTo: '' }
];

user.service.ts

export class UserService {
    constructor() { }

    setUser() {
      //In real app case i would be implimenting a auth check action and will set localStorage value on success 
      const userDataNewData = {
          token:'SOMETOKENSTRINGGOESHERE',
          name:'wade wilson',
          email:'[email protected]',
          is_admin:1,
          avatar:'avatar.jpg',
          user_id:123
      };
      // store user details and jwt token in local storage to keep user logged in between page refreshes
      localStorage.setItem('authUser', JSON.stringify(userDataNewData));   
    }
    getUser() {
      const AuthUser = JSON.parse(localStorage.getItem('authUser'));
      return AuthUser;
    }
}

app-header.component.ts

export class AppHeaderComponent{

  userData:any = {};
  constructor(private userService:UserService) { 

    //from user data variable i print user details on app header
    this.userData = userService.getUser();

  }
}

app-header.component.html

<a class="nav-link">Hello {{userData.name}} (<small>{{userData.email}}</small>) 

person Marry Mentor    schedule 15.10.2017    source источник


Ответы (1)


Вы можете использовать getter вместо userData.

в app-header.component.ts файле:

get userData():any {
   return this.userService.getUser();
};

вместо:

userData: any;

проверьте этот пример, который я сделал:

https://stackblitz.com/edit/angular-component-communication-fuautm?file=app%2F_layout%2Fapp-header%2Fapp-header.component.ts

person YairTawil    schedule 15.10.2017
comment
Мне жаль, что я не понял получателя из плункера, он не похож на тот, который мне нужен. Если его не слишком много, вы можете отредактировать мои блит-файлы стека? stackblitz.com/edit/angular-component-communication - person Marry Mentor; 16.10.2017
comment
конечно, взгляните на app-header.component: stackblitz.com/edit/ - person YairTawil; 16.10.2017
comment
извините за опоздание с ответом. он работает, но у меня тоже есть другая ситуация с тем же условием, в котором этот раздел вызывает HTTP-запрос и отображает выходной заголовок. поэтому я не могу назначить прямой ответ на запрос API для возврата в геттер. образец, пожалуйста, проверьте stackblitz.com/edit/angular-component-communication-7g2g5d - person Marry Mentor; 17.10.2017