【问题标题】:Property 'user' is used before its initialization - in Angular属性“用户”在其初始化之前使用 - 在 Angular 中
【发布时间】:2021-07-21 13:01:06
【问题描述】:

我在 google 和 StackOverflow 中搜索了有关此错误的信息,但我无法修复此错误,谁能帮助我。

这是我的 auth-service.ts 文件:

import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { LoginService } from './login.service';
import { User } from '../interfaces/Ilogin';

@Injectable({
  providedIn: 'root'
})
export class AuthService implements  CanActivate {
  user:User;
  constructor(public loginService: LoginService, public router: Router) {}
  canActivate(): boolean {
    this.loginService.loggedIn.subscribe(next => {
      this.user = next;
    });
    if (this.user) {
      return true;
    }
   this.router.navigate(['home']);
   return false; 
  }
}

这是我的 login.component.ts 文件:

import { Component, OnInit, Inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { LoginService } from '../services/login.service';
import { FormBuilder, FormGroup } from '@angular/forms';
import { Router } from '@angular/router';
import { User } from '../interfaces/Ilogin';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
  loginForm: FormGroup;
  user = {} as User;
  constructor(
    public dialogRef: MatDialogRef<LoginComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any, 
    private loginService: LoginService, 
    private fb: FormBuilder,
    private router: Router) {}

    ngOnInit() {
      this.loginForm = this.fb.group({
        mobileNumber: [''],
        password: ['']
      })
    }
    login(){
      if (this.loginForm.valid){
        this.user.mobileNumber = this.loginForm.value.mobileNumber;
        this.loginService.loggedIn.next(this.user);
        this.onNoClick();
      }
    }

  
  onNoClick(): void {
    this.dialogRef.close();
  }
}

这是我的Ilogin.ts界面文件:

 export interface User {
    mobileNumber: string;
  }

这是我的 login.service.ts 文件:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { User } from '../interfaces/Ilogin';

@Injectable({
providedIn: 'root'
})
export class LoginService {
 user: User;
 loggedIn = new BehaviorSubject(this.user);
 constructor() { }

isLoggedIn(): boolean {
 console.log(this.loggedIn);
 return true;
}
}

我收到的错误消息:

src/app/services/login.service.ts:10:39 - 错误 TS2729:属性 'user' 在其初始化之前使用。

loggedIn = new BehaviorSubject(this.user); ~~~~

src/app/services/login.service.ts:9:3 用户:用户; ~~~~ 这里声明了“用户”。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    我认为错误来自login.service,因为您正在使用未初始化的用户设置loggedIn

    试试这个loggedIn = new BehaviorSubject(null);

    如果你不需要在开始时初始化你的user,你应该使用Subject而不是BehaviorSubject

    【讨论】:

    • 我仍然会使用BehaviourSubject - 否则在发出之后订阅的任何页面都无法获得登录用户,直到执行下一次登录。但是,如果可以保证应用程序中需要知道登录用户的所有内容在发出用户之前都已订阅,那么您是对的。
    • 或者只是user: User = null;。此外,ReplaySubject(1) 通常比Subject 更好用以避免头痛。
    猜你喜欢
    • 2021-02-13
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2021-07-13
    • 2017-09-18
    • 2013-03-02
    相关资源
    最近更新 更多