Angular 7 服务文件不保持变量状态
Angular 7 service file not keeping variable state
我有 2 个组件和 1 个服务文件,
有一个登录组件和一个仪表板组件。
这是我的登录组件,它在服务文件中订阅了一个http请求。当我控制台记录 this.userService.user
时,它 return 是正确的。当我路由到 dashboard
并在仪表板组件内记录 this.userService.user
时,它是未定义的。
import { Component, OnInit } from "@angular/core";
import { RouterExtensions } from "nativescript-angular/router";
import { UserService } from "../../shared/services.module";
@Component({
selector: "login",
moduleId: module.id,
templateUrl: "./login.component.html",
styleUrls: ["./login.css"],
})
export class LoginComponent implements OnInit {
email: string;
password: string;
constructor(private router: RouterExtensions, private userService: UserService) { }
signUp() {
this.userService.login(this.email, this.password)
.subscribe(res => {
console.log(this.userService.user)
this.router.navigate(["/dashboard"], { clearHistory: true, animated: false });
});
}
ngOnInit(): void {
}
}
这是我的仪表板组件,当我登录时 this.userService.user
它未定义。
import { Component, OnInit, Input } from "@angular/core";
import { RouterExtensions } from "nativescript-angular/router";
import { UserService } from "../../shared/services.module";
@Component({
selector: "dashboard",
moduleId: module.id,
templateUrl: "./dashboard.component.html",
styleUrls: ["./dashboard.css"],
})
export class DashboardComponent implements OnInit {
constructor(private router: RouterExtensions, private userService: UserService) {
}
ngOnInit(): void {
console.log(this.userService.user)
console.log(this.userService.getUserName())
}
}
这是我的服务文件
import { Injectable } from "@angular/core";
import { HttpClient } from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
import { Config } from "../config";
import { catchError } from 'rxjs/operators';
import { map, delay, retryWhen, take } from 'rxjs/operators';
import { HttpErrorHandler, HandleError } from '../../http-error-handler.service';
import { User } from '../../models/user/user'
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
@Injectable()
export class UserService {
user: any;
private handleError: HandleError;
constructor(private http: HttpClient, httpErrorHandler: HttpErrorHandler) {
this.handleError = httpErrorHandler.createHandleError('HeroesService');
}
getUserName() {
console.log("return name");
console.log(this.user)
if (!this.user) {
return "failed";
}
console.log(this.user.name)
return this.user.name
}
login(email, password) {
let data = JSON.stringify({'email': email,'password': password})
return this.http.post(Config.userUrl + 'login', data, httpOptions)
.map((res: any) => {
let u = res.user
this.user = new User(u.name, u.email)
console.log(this.user)
return res
})
.pipe(
catchError(this.handleError('login', null))
);
}
}
奇怪的是,当我什至使用像 getUserName
这样的辅助函数来 return 名称时,即使在服务文件中它仍然未定义。
知道为什么它 return 未定义吗?任何帮助将不胜感激。
谢谢
试试这个:
模块你在哪里提供服务
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
... // You have propably there the service that you want to provide globally, remove it
]
})
export class YourModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: YourModule, // name of this module
providers: [ YourService ] // put there the service, that you want to provide globally
};
}
}
app.module.ts
@NgModule({
declarations: [
AppComponent,
...
],
imports: [
...
YourModule.forRoot() // add this
],
providers: [
...
],
bootstrap: [
AppComponent
]
})
export class AppModule {
}
您想在全球范围内提供的服务
@Injectable() // remove the "providedIn: ..." if you have it there
export class YourService {
...
}
组件
@Component({
selector: "dashboard",
moduleId: module.id, // remove this line
templateUrl: "./dashboard.component.html",
styleUrls: ["./dashboard.css"],
})
export class DashboardComponent implements OnInit {
...
}
并且不要忘记将 YourModule
导入到要使用 YourService
的模块的 imports
中。
我以为你这样声明的时候
@Injectable({providedIn:'root'})
它对整个应用程序可用
我有 2 个组件和 1 个服务文件, 有一个登录组件和一个仪表板组件。
这是我的登录组件,它在服务文件中订阅了一个http请求。当我控制台记录 this.userService.user
时,它 return 是正确的。当我路由到 dashboard
并在仪表板组件内记录 this.userService.user
时,它是未定义的。
import { Component, OnInit } from "@angular/core";
import { RouterExtensions } from "nativescript-angular/router";
import { UserService } from "../../shared/services.module";
@Component({
selector: "login",
moduleId: module.id,
templateUrl: "./login.component.html",
styleUrls: ["./login.css"],
})
export class LoginComponent implements OnInit {
email: string;
password: string;
constructor(private router: RouterExtensions, private userService: UserService) { }
signUp() {
this.userService.login(this.email, this.password)
.subscribe(res => {
console.log(this.userService.user)
this.router.navigate(["/dashboard"], { clearHistory: true, animated: false });
});
}
ngOnInit(): void {
}
}
这是我的仪表板组件,当我登录时 this.userService.user
它未定义。
import { Component, OnInit, Input } from "@angular/core";
import { RouterExtensions } from "nativescript-angular/router";
import { UserService } from "../../shared/services.module";
@Component({
selector: "dashboard",
moduleId: module.id,
templateUrl: "./dashboard.component.html",
styleUrls: ["./dashboard.css"],
})
export class DashboardComponent implements OnInit {
constructor(private router: RouterExtensions, private userService: UserService) {
}
ngOnInit(): void {
console.log(this.userService.user)
console.log(this.userService.getUserName())
}
}
这是我的服务文件
import { Injectable } from "@angular/core";
import { HttpClient } from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
import { Config } from "../config";
import { catchError } from 'rxjs/operators';
import { map, delay, retryWhen, take } from 'rxjs/operators';
import { HttpErrorHandler, HandleError } from '../../http-error-handler.service';
import { User } from '../../models/user/user'
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
@Injectable()
export class UserService {
user: any;
private handleError: HandleError;
constructor(private http: HttpClient, httpErrorHandler: HttpErrorHandler) {
this.handleError = httpErrorHandler.createHandleError('HeroesService');
}
getUserName() {
console.log("return name");
console.log(this.user)
if (!this.user) {
return "failed";
}
console.log(this.user.name)
return this.user.name
}
login(email, password) {
let data = JSON.stringify({'email': email,'password': password})
return this.http.post(Config.userUrl + 'login', data, httpOptions)
.map((res: any) => {
let u = res.user
this.user = new User(u.name, u.email)
console.log(this.user)
return res
})
.pipe(
catchError(this.handleError('login', null))
);
}
}
奇怪的是,当我什至使用像 getUserName
这样的辅助函数来 return 名称时,即使在服务文件中它仍然未定义。
知道为什么它 return 未定义吗?任何帮助将不胜感激。 谢谢
试试这个:
模块你在哪里提供服务
@NgModule({
imports: [
...
],
declarations: [
...
],
providers: [
... // You have propably there the service that you want to provide globally, remove it
]
})
export class YourModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: YourModule, // name of this module
providers: [ YourService ] // put there the service, that you want to provide globally
};
}
}
app.module.ts
@NgModule({
declarations: [
AppComponent,
...
],
imports: [
...
YourModule.forRoot() // add this
],
providers: [
...
],
bootstrap: [
AppComponent
]
})
export class AppModule {
}
您想在全球范围内提供的服务
@Injectable() // remove the "providedIn: ..." if you have it there
export class YourService {
...
}
组件
@Component({
selector: "dashboard",
moduleId: module.id, // remove this line
templateUrl: "./dashboard.component.html",
styleUrls: ["./dashboard.css"],
})
export class DashboardComponent implements OnInit {
...
}
并且不要忘记将 YourModule
导入到要使用 YourService
的模块的 imports
中。
我以为你这样声明的时候
@Injectable({providedIn:'root'})
它对整个应用程序可用