【发布时间】:2017-10-31 02:33:25
【问题描述】:
我在我的应用程序组件中订阅的服务中有一个 observable。数据正在通过订阅传递,没有问题,但由于某种原因,我无法让 UI 使用新信息进行更新。我知道数据正在到达那里,因为它正在记录到控制台。
这是我的 app.component 代码:
import {Component, OnDestroy, OnInit} from '@angular/core';
import {UserDetailsService} from './services/user-details.service';
import {User} from './shared/models/user';
import {Subscription} from 'rxjs/Subscription';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, OnDestroy {
title = 'the Portfolio';
user: User;
userSub: Subscription;
constructor(public userDetails: UserDetailsService) {
}
ngOnInit(): void {
this.userSub = this.userDetails.user$.subscribe(user => {
this.user = user;
console.log(user);
});
}
ngOnDestroy() {
this.userSub.unsubscribe();
}
}
我更新 observable 的用户登录组件:
import {Component, AfterViewInit, NgZone} from '@angular/core';
import {UserDetailsService} from '../services/user-details.service';
import {User} from '../shared/models/user';
declare const gapi: any;
@Component({
selector: 'app-user-login',
templateUrl: './user-login.component.html',
styleUrls: ['./user-login.component.css']
})
export class UserLoginComponent implements AfterViewInit {
constructor(private _zone: NgZone, private userDetails: UserDetailsService) {
console.log(this);
}
ngAfterViewInit() {
gapi.load('auth2', () => {
const auth = gapi.auth2.init({
'clientId': 'YOURID.apps.googleusercontent.com'
});
auth.attachClickHandler('google-login-button', {},
(googleUser) => {
const profile = googleUser.getBasicProfile();
// console.log('Token || ' + googleUser.getAuthResponse().id_token);
// console.log('ID: ' + profile.getId());
// console.log('Name: ' + profile.getName());
// console.log('Image URL: ' + profile.getImageUrl());
// console.log('Email: ' + profile.getEmail());
this.userDetails.setLoginUser(new User({
id: profile.getId(),
name: profile.getName(),
email: profile.getEmail()
}));
},
(error) => {
alert(JSON.stringify(error, undefined, 2));
});
});
}
}
用户详情服务:
import {Injectable, OnInit} from '@angular/core';
import {User} from '../shared/models/user';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import 'rxjs/add/operator/map';
@Injectable()
export class UserDetailsService implements OnInit {
private userSubject = new BehaviorSubject<User>(new User());
user$ = this.userSubject.asObservable();
constructor() {
}
ngOnInit(): void {
}
public setLoginUser(user: User) {
this.userSubject.next(user);
}
}
这是我的 UI 代码:
<div *ngIf="user" class="alert alert-success">{{user.name}}</div>
{{user.name}}
我错过了什么?卡在这上面已经一天多了。
任何帮助表示赞赏,在此先感谢。
【问题讨论】:
-
控制台中有任何消息以及日志吗?
-
我不完全确定,因为我只是从 angular 2/4 开始,但您不会错过
async管道吗?*ngIf="user | async" -
@jonrsharpe 控制台没有错误,只是标准的 XHR 完成消息
-
@maurycy 只有当他们将 observable 直接暴露给组件时才会如此。
user: User;在这里,而不是user: Observable<User>; -
@maurycy 据我所知,如果我没有手动订阅代码,则需要 async 关键字。但我试过 {{(userDetails.user$).name | async}} 并且它仍然没有更新 ui