Простой способ обработки состояния в Angular

Вы также работали над приложением, в котором вы сами или команда отправляете тонны данных через реквизиты в родительские и дочерние компоненты и обратно.
Это то, что часто происходит, и это затрудняет внесение изменений в приложение, потому что для использования ваших компонентов требуется родитель со знанием данных, это приводит к копированию и вставке кода повсюду, это улица с односторонним движением для переписывания вашего приложения через год или два.
Альтернатива
Есть другой способ сохранить ваш код чистым и пригодным для повторного использования.
Он работает, ничего не добавляя в ваше приложение, кроме rxjs, который уже есть.
Я склонен абстрагировать состояние от логики вашего представления, таким образом, состояние — это то, как выглядят данные. Затем, когда у вас есть несколько компонентов, независимо от того, насколько они вложены, вы можете прослушивать это состояние и вызывать действия, которые необходимо выполнить в этом состоянии.
Переходим к коду:
// user.state.ts
export interface User {
name: string;
avatarUrl: string;
}
@Injectable({
providedIn: 'root'
})
export class UserState {
private user = new BehaviorSubject<User>({
name: 'John Doe',
avatarUrl: 'https://example.com/avatar.png'
});
user$ = this.user.asObservable();
updateUser(user: User) {
this.user.next(user);
}
}
// any.component.ts
@Component({
selector: ‘app-user-icon’,
template: `
<ng-container *ngIf="user$ | async as user">
<img [src]="user.avatarUrl">
{{ user.name }}
</ng-container>
`
})
export class UserIconComponent {
user$ = this.userState.user$;
constructor(private userState: UserState) {}
}
Этот метод я нахожу очень простым для рассуждений о данных и о том, как их обновлять, а мои компоненты остаются маленькими и предсказуемыми.
К вашему сведению, асинхронный канал автоматически отменяет подписку
Я предпочитаю иметь шаблоны в виде отдельных файлов, но для простоты я храню их в комп-файле.
// Саймон