در انگولار، مدیریت وضعیت تنها از طریق یک حالت از پیش تعریف شده صورت نمیپذیرد. برای مثال ذخیره دیتا در ngrx بصورت متمرکز انجام میشود. این حالت برای اپ هایی که فعالیت کاربران در فرانت اند اهمیت دارد کاملا مناسب است. برای مثال، اگر در اپ شما چندین کامپوننت بخواهند از فعالیت کاربر (چه چیزی را انتخاب یا وارد کرده) مطلع شوند، میتوانید این فعالیت ها را در استور ذخیره کنید تا کامپوننت ها بتوانند به این فعالیت ها دسترسی پیدا کنند.
rxJs دارای observerها (consuming interface) و observableها (push interface) میباشد. Subject هم observer است و هم observable. behaviorSubject یک نوع Subject است که مقدار current را منتشر (emit) میکند. با اینکه مفهوم آن ممکن است سخت باشد ولی استفاده از آن بسیار آسان است.
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Data } from '../entities/data';
@Injectable()
export class DataService {
private dataSource = new BehaviorSubject(new Data());
data = this.dataSource.asObservable();
constructor() { }
updatedDataSelection(data: Data){
this.dataSource.next(data);
}
}
BehaviorSubject مقداری که باید با دیگر کامپوننت ها به اشتراک گذاشته شود را نگه میدارد. کامپوننت ها میتوانند به data ای که مقدار BehaviorSubject را بر میگردانند (return) - بدون اینکه آن مقدار را تغییر دهند- subscribe شوند. در updateDataSelection میتوانیم متد next را فراخوانی کنیم و مقدار جدیدی به BehaviorSubject بدهیم.
//inject service into component
...
dataService.data.subscribe(data => {
//do what ever needs doing when data changes
})
...
//update the value of data in the service
dataService.updateData(newData);
به نقل از: Medium