Ich bin mir sicher, dass dies ein einfaches Problem ist, ich weiß einfach nicht, wo ich es genau festlegen soll. Ich habe einen UserProfile-Dienst, der ein BehaviorSubject für die userdata erstellt. Wenn ich mich anmelde benutze ich diesen Dienst um die Userdata zu senden. Sobald ich eingeloggt bin, abonniere ich diese Benutzerdaten in meiner Dashbord-Komponente. Aber die beobachtbare Benutzerdatenbank gibt nur das erste leere Objekt zurück, als ich das BehaviorSubject zum ersten Mal erstellt habe. Es ist so, als würde die Login-Funktion, die die neuen Daten mit .next() versendet, nur ausgeführt, nachdem das Dashboard das BehaviourSubject abonniert hat. Ich habe versucht, die Subskription meines Dashboards in ngAfterContentInit() zu setzen, so dass die .next() vor dem Abonnement ausgeführt wird, aber ich bekomme immer noch ein leeres Objekt. Wenn ich eine .next() über die Funktion set_new_data() in meinem Dashbord ausführe, um zu überprüfen, ob das Observable funktioniert, bekomme ich die Daten von .next(); Aber ich bekomme nicht die Daten, die meine Login-Komponente über die Funktion set_userdata() in meinem Service setzt.Angular BehaviorSubject Verwendung in Service und Komponente, mögliche Race Condition
Können wir Daten mit einem Dienst nicht teilen? Wird der Dienst nach dem Verlassen der Login-Komponente zerstört oder was passiert?
Mein Userprofile Service:
@Injectable()
export class UserProfileService {
public isLoggedIn: boolean = false;
public userdata: BehaviorSubject<any> = new BehaviorSubject<any>({});
constructor() {
}
public set_userdata(data) {
// this.userdata = data;
console.log(this.userdata);
if (this.userdata === undefined) {
console.log(data);
//this.userdata = new BehaviorSubject<any[]>(data);
console.log(this.userdata);
} else {
console.log(this.userdata);
this.userdata.next(data);
}
}
}
Meine Dashbord Komponente:
@Component({
selector: 'dashboard',
styleUrls: ['./dashboard.scss'],
templateUrl: './dashboard.html'
})
export class Dashboard {
public isLoggedIn: boolean;
public curr_user: object;
constructor(private _appGlobals: AppGlobals, private _user: UserProfileService) {
this._appGlobals.isUserLoggedIn.subscribe(value => this.isLoggedIn = value);
// this.curr_user = _user.userdata;
}
ngAfterContentInit() {
console.log("this executes first");
this._user.userdata.subscribe(value => {
this.curr_user = value;
console.log(value);
});
}
set_new_data() {
let obj = {
name: "test",
age: 45
};
this._user.userdata.next(obj);
}
}
Meine Konsolenausgabe, (zeigt leeres Objekt: {}, die Benutzerdaten erwartet)
Wo stellen Sie 'UserProfileService' bereit? Warum haben Sie diese Zeile in Ihrem Code auskommentiert comment '//this.userdata = new BehaviorSubject (data);'.Es ist sicher, es vollständig zu entfernen. Es sollte nicht nötig sein, eine neue Instanz zuzuweisen. Dies würde alle Abonnements ungültig machen. –
stelle ich dafür im LoginModule und im DashbordModule zur Verfügung. Diese Kommentarzeile war, weil ich versucht habe, die erste Instanz dazu zu bringen, die richtigen Daten zu haben, wenn ich das BSubject erstelle. – johan
Ist eines dieser Module lazy-loaded? Um das BehaviorSubject zu initialisieren, rufen Sie einfach 'this._userdata.next (someInitialValue);' –