【发布时间】:2017-05-07 20:25:16
【问题描述】:
我正在尝试在我的AuthenticationService 上设置token 属性。
这是我的代码:
authentication.service.ts
import { Injectable } from '@angular/core'
import { Http, Headers, Response } from '@angular/http'
import { Observable, BehaviorSubject } from 'rxjs'
import 'rxjs/add/operator/map'
import { Login } from '../../+authentication/shared/models'
import { config } from '../config'
@Injectable()
export class AuthenticationService {
private token: string
private _isConnected = new BehaviorSubject<boolean>(false)
isConnected$ = this._isConnected.asObservable()
constructor (private http: Http) {
const currentToken = JSON.parse(localStorage.getItem('currentToken'))
if (currentToken) {
this.token = currentToken.token
this._isConnected.next(true) // work
}
}
login (login: Login): Observable<any> {
return this.http.post(config.BASE_URL + '/auth/login', login)
.map((response: Response) => {
if (response.json() && response.json().success) {
const token = response.json() && response.json().token
this.token = token// don't do the work
this._isConnected.next(true) // don't do the work neither
localStorage.setItem('currentToken', JSON.stringify({token}))
return {
success: true
}
} else if (response.json() && response.json().message) {
return {
success: false,
message: response.json().message
}
}
})
}
logout (): void {
this.token = null
this._isConnected.next(false) // work
localStorage.removeItem('currentToken') // work
}
logToken (): void {
console.log(this.token) // null
console.log(localStorage.getItem('currentToken')) // {"token":"eyJhb..."}
// do the work
this.token = localStorage.getItem('currentToken')
console.log(this.token)
// do the work too
this._isConnected.next(true)
}
}
来自login.component.ts
import { Component, OnInit } from '@angular/core'
import { Router } from '@angular/router'
import { AuthenticationService } from '../../shared/services'
import { Login } from '../shared/models/index'
@Component({
selector: 'login',
templateUrl: './login.component.html',
})
export class LoginComponent {
public login: Login = new Login('test@test.fr', 'test')
public authError: string
constructor (
private router: Router,
private as: AuthenticationService
) {
if (as.getToken()) {
this.router.navigate(['/home']) // This work !! That's not
}
}
onSubmit () {
this.as.login(this.login)
.subscribe((result) => {
if (result.success) {
this.router.navigate(['/home']) // working
} else if (result.message) {
this.authError = result.message // working
}
})
}
}
authentication.service.ts的末尾,可以看到logToken函数:
logToken (): void {
console.log(this.token) // null
console.log(localStorage.getItem('currentToken')) // {"token":"eyJhb..."}
// do the work
this.token = localStorage.getItem('currentToken')
console.log(this.token)
// do the work too
this._isConnected.next(true)
}
我通过单击导航栏中的按钮从我的应用程序组件中手动调用它,并且永远不会设置令牌属性,除非我重新加载页面,在这种情况下,它是由服务的构造函数设置的,它从 LocalStorage 获取它.
请告诉我为什么 let 不想工作,我使用箭头函数绑定它,但它似乎不起作用。
提前致谢
夏洛克标准
编辑
我尝试将响应处理委托给私有方法以查看 this 绑定是否更好,但它仍然无法正常工作(authentication.service.ts):
login (login: Login): Observable<any> {
return this.http.post(config.BASE_URL + '/auth/login', login)
.map((response: Response) => this.handleResponse(response))
}
private handleResponse (response: Response) {
if (response.json() && response.json().success) {
// login successful if there's a jwt token in the response
const token = response.json() && response.json().token
this.token = token
localStorage.setItem('currentToken', JSON.stringify({token}))
return {
success: true
}
} else if (response.json() && response.json().message) {
return {
success: false,
message: response.json().message
}
}
}
编辑 2
我在 login() 和 logToken() 函数中记录了 authentication.service.ts 中的 this 关键字。
它每次都返回一个 AuthenticationService,包含相同的属性,但在登录函数中它包含 token 属性,该属性在此函数之外丢失。
【问题讨论】:
-
不是
const token = response.json() && response.json().token的问题吗?我认为&&使表达式始终为布尔值true/false。 -
... 问题很可能出现在
this.as.login(this.login)中,因为您丢失了this上下文,请参阅 stackoverflow.com/questions/20279484/…。请改用this.as.login(data => this.login(data))。 -
@martin 为什么他会丢失
this上下文?this.as.login(this.login)此时仍在全球范围内吗?也不会,this.login(data)只会出错,因为此时data将为空? -
你是什么意思“不做工作”?你看到异常还是什么?在“不做工作”之前做 console.log(this) 。它打印什么?
-
你自己至少应该做一些调试。你能告诉我们做了什么,结果如何? “不要做这项工作”令人困惑。
标签: angular this rxjs observable angular2-http