rxjs observables angulaire 2 sur localstorage changement
Je suis en train de créer une observable qui renvoie des valeurs lorsque les modifications apportées à un localStorage variable qui se passe. Mon abonné est de ne pas obtenir les nouvelles valeurs sur des changements localStorage (ou une variable de mémoire).
navbar.component.js
import { Component, OnInit } from '@angular/core';
import { UserService } from '../services/user.service';
/**
* This class represents the navigation bar component.
*/
@Component({
moduleId: module.id,
selector: 'sd-navbar',
templateUrl: 'navbar.component.html',
styleUrls: ['navbar.component.css'],
providers: [UserService]
})
export class NavbarComponent implements OnInit {
loggedIn: boolean;
constructor(private us: UserService) { }
ngOnInit() {
this.us.isLoggedIn().subscribe(loggedIn => {
this.loggedIn = loggedIn;
});
}
}
auth.composante.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { UserService } from '../shared/services/user.service';
/**
* This class represents the lazy loaded AuthComponent.
*/
@Component({
moduleId: module.id,
selector: 'sd-auth',
templateUrl: 'auth.component.html',
styleUrls: ['auth.component.css'],
providers: [UserService]
})
export class AuthComponent implements OnInit {
authParams = {
provider: '',
params: {}
};
constructor(private route: ActivatedRoute, private us: UserService) { }
ngOnInit() {
this.route.params.forEach((param) => {
this.authParams.provider = param.authprovider;
});
this.route.queryParams.forEach((queryParams) => {
this.authParams.params = queryParams;
});
this.us.logIn("google", JSON.stringify(this.authParams));
console.log(JSON.parse(localStorage.getItem('authParams')));
}
}
de l'utilisateur.service.ts
//user.service.ts
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subscriber } from 'rxjs/Subscriber';
@Injectable()
export class UserService {
private loggedIn = false;
private logger = new Observable<boolean>((observer: Subscriber<boolean>) => {
observer.next(this.loggedIn);
});
constructor() {
if (localStorage.getItem('authParams')) {
this.loggedIn = !!JSON.parse(localStorage.getItem('authParams')).params.id_token;
} else {
this.loggedIn = false;
}
}
logIn(provider: string, providerResponse: string) {
localStorage.setItem('authParams', providerResponse);
this.loggedIn = true;
}
isLoggedIn(): Observable<boolean> {
return this.logger;
}
logOut() {
localStorage.removeItem('authParams');
this.loggedIn = false;
}
}
Flux ressemble
Étape 1 - barre de navigation s'abonne à UserService (Obtient la valeur par défaut de loggedIn=false)
Étape 2 - AuthComponent mises à jour UserService (jeux de loggedIn = true)
Mon abonnement dans la barre de navigation n'est pas mis à jour. Ce qui me manque ici. Dois-je mettre quelque chose dans la méthode de logIn de UserService comme l'événement de l'émetteur?
Il n'a pas d'importance si localstorage est utilisé ici ou pas. Comment peut-abonnés savoir que la nouvelle valeur est enregistrée?
logIn
ne pas pousser une nouvelle valeur à la observables. Un objet ou un événement de l'émetteur serait approprié ici.
OriginalL'auteur Prabhat | 2016-11-03
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez est un Sujet. Découvrez les docs ici (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md)
Pour un exemple rapide, quelque chose comme ceci:
localStorage fournit une api pour les changements que vous pourriez vous abonner, mais comme vous le dites, ils pourraient être modifiés manuellement, ou l'utilisateur peut être connecté au serveur. Une approche que l'on pourrait prendre est de s'inscrire à l'adresse http 401s, et la mise à jour de l'utilisateur connecté en valeurs, en conséquence/afficher un formulaire de connexion
OriginalL'auteur Fiddles
Pour être plus précis, l'utilisation de BehaviourSubject
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
Ex:
et d'apprendre la différence entre BehaviorSubject et Observables:
Angulaire 2 - le Comportement de l'Objet vs Observables?
OriginalL'auteur virsha