これは簡単な問題だと確信していますが、それを特定する場所はわかりません。 私は、userdataのBehaviorSubjectを作成するUserProfileサービスを持っています。 私がログインすると、このサービスを使用してユーザデータをブロードキャストします。 ログインすると、私のDashbordコンポーネントのこのユーザーデータを購読します。しかし、私が最初にBehaviorSubjectを作成したとき、観測可能なuserdataは最初の空のオブジェクトを返すだけです。これは、.next()で新しいデータをプッシュするログイン関数が、BehaviourSubjectにサブスクライブしたダッシュボードの後でのみ実行されているかのようです。 .next()がサブスクリプションの前に実行されるように、ダッシュボードをngAfterContentInit()に登録しようとしましたが、空のオブジェクトがまだ残っています。私のダッシュボード内でset_new_data()関数を使って.next()を実行して観測可能な仕事があるかどうかを調べると、.next();によってデータが渡されます。しかし、私は私のログインコンポーネントが私のサービス内のset_userdata()関数によって設定されたデータを取得しません。角度動作サービスおよびコンポーネントでのオブジェクトの使用状況、競合状態の可能性
サービスを使用してこのようなデータを共有することはできませんか?ログインコンポーネントを終了した後、または何が起きているのか、サービスは破壊されていますか?
マイUSERPROFILEサービス:
@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);
}
}
}
マイDashbordコンポーネント:
@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);
}
}
マイコンソール出力は、(空のオブジェクトを示している:{}、ユーザーデータを期待)
あなたは 'UserProfileService'をどこに提供しますか?なぜあなたはこの行をあなたの中でコメントアウトしていますか? '//this.userdata = new BehaviorSubject(data);'。完全に取り除いても安全です。新しいインスタンスを割り当てる必要はありません。これにより、すべてのサブスクリプションが無効になります。 –
私はそれをLoginModuleとDashbordModuleに提供します。そのコメント行は、BSubjectを作成するときに最初のインスタンスに正しいデータを持たせようとしていたためです。 – johan
これらのモジュールの1つが遅延ロードされていますか? BehaviorSubjectを初期化するには、 'this._userdata.next(someInitialValue);を呼び出してください。 –