【问题标题】:Uncaught (in promise): Error: Cannot read property of undefined未捕获(承诺):错误:无法读取未定义的属性
【发布时间】:2023-03-31 06:59:01
【问题描述】:

组件使用参数从服务中获取用户

@Component({
    selector: 'users',
    providers: [UserService],
    template: `
    <p>{{user.id}}</p>
`
})
export class UserPageComponent implements OnInit  {
    constructor(
        private userService: UserService,
        private route: ActivatedRoute
    ) {};

    ngOnInit(): void {
        this.route.params.forEach((params: Params) => {
            let id = +params['id'];
            this.userService.getUser(id)
                .then(user => {console.log(user.id);this.user = user})
        });
    }

服务:

@Injectable()
export class UserService {
    private postUrl = 'http://127.0.0.1:8000/user-detail/';  // URL to web api
    constructor(private http: Http) {
    }

    getUser(id: number): Promise<User> {

        return this.http.get(this.postUrl+id)
            .toPromise()
            .then(response => response.json() as User)
            .catch(this.handleError);

    };

我收到错误Uncaught (in promise): Error: Error in ./UserPageComponent class UserPageComponent - inline template:1:7 caused by: Cannot read property 'id' of undefined

看起来好像服务没有发送承诺,尽管它应该发送。 如何解决这个问题?

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    看起来你的组件没有用户的默认值,所以当组件渲染尝试添加默认值时它是未定义的

    @Component({
        selector: 'users',
        providers: [UserService],
        template: `
        <p>{{user.id}}</p>
    `
    })
    export class UserPageComponent implements OnInit  {
        user = {} // default value for user
    
        constructor(
            private userService: UserService,
            private route: ActivatedRoute
        ) {};
    
        ngOnInit(): void {
            this.route.params.forEach((params: Params) => {
                let id = +params['id'];
                this.userService.getUser(id)
                    .then(user => {console.log(user.id);this.user = user})
            });
        }
    

    其实这里加一些条件逻辑会更好

    <p *ngIf="user">{{user.id}}</p>
    

    它应该可以工作

    【讨论】:

    • 您也可以添加一个由问号符号表示的条件(三元运算符)?这个表达式 {{user.id}} 只有在条件为真时才会执行
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多