2016-07-09 11 views
5

Niedawno przeniosłem się do Angular 2 z Angular 1 i często napotykam problemy próbujące wykryć zmiany we właściwości obiektu (coś, co poprzednio zrobiono przez $ watch).Obserwowanie zmiany właściwości obiektu w Angular 2

Typowy przypadek użycia jest to, że mam usługę iniekcji, który utrzymuje kawałek danych, na przykład obiekt zawierający ustawienia:

@Injectable() 
export class SettingsService 
{ 
    _settings = { 
     'settingA' : true, 
     'settingB' : false 
    } 

    ... 

    get settings() 
    { 
     return this._settings; 
    } 
} 

będę wtedy mają składnik taki jak strona ustawień w aplikacja Ionic że dostanie ustawienia z serwisu ustawienia:

constructor(private settingsService : SettingsService) 
{ 
    this.settings = settingsService.settings; 
} 

i jest bezpośrednio kilka właściwości obiektów do komponentu UI jak toggle. Problem jest inny niż wywoływanie funkcji dla każdego zdarzenia zmiany przełączania, w jaki sposób usługa lub komponent może wiedzieć, że obiekt ustawień zmienił się, aby wywołać odpowiednie działanie, takie jak zapisanie ustawień w składnicy danych?

Odpowiedz

6

Aby zbudować możliwą do zaobserwowania usługę przesyłania danych, można użyć BehaviorSubject z rxjs. Tworzysz temat w swojej usłudze i musisz subskrybować ten temat w swoich komponentach.

Oto kilka samouczków dotyczących tworzenia usług: example 1, example 2.

Masz teoretycznie możliwość skorzystania z usługi EventEmitter. Ale nie powinieneś go używać. Zapoznaj się z tym answer, aby uzyskać więcej informacji. W tej odpowiedzi można znaleźć także przykład jak go rozwiązać z użyciem Observable zamiast BehaviorSubject

+0

Wydaje użyciu BehaviorSubject nadal wymaga wywołania funkcji, gdy przełącznik zmienia stan, a nie tylko być w stanie odebrać zmiany w służbie . Dobre uwagi dotyczące korzystania z EventEmitter jednak, użyłem ich gdzie indziej do powiadamiania składników aktualizacji danych w usługach. – cubiclewar

Powiązane problemy