как один угловой компонент скажет другому обновлять без обновления всей страницы вручную - PullRequest
0 голосов
/ 03 июня 2019

У меня есть бэкэнд узла с аутентификацией firebase, который подключается к угловому интерфейсу. У меня есть два компонента - это панель навигации и форма регистрации. Когда я регистрируюсь, я вызываю бэкэнд-функцию для регистрации в firebase и отсылаю обратно firebase.auth (). CurrentUser, как мой угловой интерфейс navbar обнаруживает прибытие такого пользователя и обновляет себя соответственно, без меня обновить страницу?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Оператор ввода и вывода хорош, но он не может обеспечить гибкость обмена данными, такими как наблюдаемые

Здесь Вам необходимо использовать Subject Observable для обмена данными между приложением. Это очень простая и полезная вещь. Вы можете отправить сигнал всем LISNER, когда пользователь зарегистрирован.

Что нужно сделать

1) Создание одного служебного файла для обмена данными - услуга у субъекта заметна. Используя это, вы можете подписаться на канал для пользовательских данных

2) В вашем слушателе компонента заголовка этот сервис и установить поступающие данные слушателя в заголовок пользовательских данных

3) Из вашего реестра, обновления профиля или из любого другого места, где были обновлены пользовательские данные, только после того, как эти данные до поддаются наблюдению, они автоматически обновят пользователя во всем приложении . следуйте приведенному ниже примеру, чтобы достичь этого

Рабочую демонстрацию можно найти по ссылке ниже

https://jasonwatmore.com/post/2019/02/07/angular-7-communicating-between-components-with-observable-subject

0 голосов
/ 03 июня 2019

Я предполагаю, что так устроены ваши компоненты:

// In app.component.html
<app-navbar></app-navbar>
<router-outlet></router-outlet>   // For rest of the pages.

Здесь есть 2 способа (я не буду говорить о включении ngModel), с помощью которых мы можем передавать данные на панель навигации для обновления статуса./ данные навигационной панели.

1.Использование декораторов ввода / вывода.

// Your navbar.component.ts

// I'm assuming you have set up model for User. If no, then change the type to **any**.
@Input() currentUser: IUser;   

// Your navbar.component.html
<p *ngIf="currentUser"> {{currentUser | json}} </p>   // Render this if currentUser exists. By default, it is undefined.

Теперь в вашем компоненте приложения :

//In your app.component.ts

User: any | IUser;

public authenticateUser() {
 this.someServiceToAuthenticateUser.subscribe(
  res => this.User = res,    
  error => console.error(error)
);
}


 // In your app.component.html
<app-navbar [currentUser]="User"></app-navbar>
<router-outlet></router-outlet>
Использование общего сервиса.
Вы можете создать общий сервис, в котором будет находиться аутентифицированный пользователь.Из вашего компонента приложения вы можете указать пользователю успешность аутентификации ответа, а из других компонентов вы можете получить аутентифицированного пользователя.
export class UserService {
 private currentUser: IUser | any;

 setCurrentUser(userToSet: any) {
    this.currentUser = userToSet;
}

getCurrentUser() {
 return this.currentUser;
}

Теперь в вашем компоненте приложения , если запрос на проверку подлинности использования выполнен успешно, тогда установите currentUser of UserService:

//In your app.component.ts

User: any | IUser;

public authenticateUser() {
 this.someServiceToAuthenticateUser.subscribe(
  res => this.UserService.setCurrentUser(res),    
  error => console.error(error)
);
}

Теперь, в вашем компоненте панели навигации получите текущего пользователя из UserService.

// In navbar.component.ts

 currentUser: any;

constructor(private userServicce: UserService) {
 getuserFromservice();
}

 public getuserFromservice() {
 setInterval(() => {
  curretnUser = this.userService.getCurrentUser()
}, 3000);

Важно: При таком подходе обратите внимание на компонент панели навигации, у меня естьустановить текущего пользователя в setInterval.Это связано с тем, что ваш getuserFromservice () будет запущен только один раз (при его создании / визуализации в первый раз), и в это время userService не будет иметь currentUser.Так что navbar никогда не получит currentUser.Если вы хотите заменить подход setInterval (я настоятельно рекомендую заменить его), используйте Subjects / BehaviourSubject / ReplaySubject .Я не включил их здесь, потому что Rxjs сама по себе огромная тема, и в том числе ее было бы слишком сложно понять.

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