Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 2-TypeError:无法设置未定义的属性“userId”_Angular_Typescript_Model_Undefined - Fatal编程技术网

Angular 2-TypeError:无法设置未定义的属性“userId”

Angular 2-TypeError:无法设置未定义的属性“userId”,angular,typescript,model,undefined,Angular,Typescript,Model,Undefined,我创建了一个模型,在一个方法中,当我想给模型的属性赋值时,我得到了这个错误:TypeError:无法将属性“userId”设置为undefined 这是我的模型: export class ApplicationUser { constructor( public id: string, public userId: string ) { } } 方法如下: public alreadyExists(sub: string) { let

我创建了一个模型,在一个方法中,当我想给模型的属性赋值时,我得到了这个错误:TypeError:无法将属性“userId”设置为undefined

这是我的模型:

export class ApplicationUser {
    constructor(
        public id: string,
        public userId: string
    ) { }
}

方法如下:

public alreadyExists(sub: string) {
    let applicationUser: ApplicationUser;

    this.applicationUserService.getApplicationUser(sub)
                                    .subscribe(
                                        appUser => applicationUser = appUser,
                                        error => this.errorMessage = <any>error
                                    );

    if (applicationUser == null) {
        applicationUser.userId = sub;

        this.applicationUserService.postApplicationUser(applicationUser)
                                       .subscribe(
                                           error => this.errorMessage = <any>error
                                       );
    }

    localStorage.setItem('userId', sub);
}
错误出现在此行之后:applicationUser.userId=sub

如果不获取此错误消息,我必须更改/添加什么

谢谢大家!

let applicationUser: ApplicationUser;
上面的一行不会在这里创建实际的对象实例,它只是一个引用。错误表示applicationUser未定义

你可以试试看

let applicationUser: ApplicationUser = new ApplicationUser ('', '');
或者未经测试

let applicationUser: ApplicationUser
 applicationUser = Object.create(ApplicationUser.prototype);
 this.constructor.apply(applicationUser, ['', '']);
上面的一行不会在这里创建实际的对象实例,它只是一个引用。错误表示applicationUser未定义

你可以试试看

let applicationUser: ApplicationUser = new ApplicationUser ('', '');
或者未经测试

let applicationUser: ApplicationUser
 applicationUser = Object.create(ApplicationUser.prototype);
 this.constructor.apply(applicationUser, ['', '']);

您的代码至少有三个问题

首先,您忽略了代码的异步性质,第二,您尝试写入一个空对象的属性,第三,您将错误回调作为成功回调传递给post

我不知道“sub”是什么,但你似乎把它用作用户ID,所以我也这么做了。这里有一个替代建议,它可以实现您想要做的事情。我使用async/await构造,而不是在Promissions中链接逻辑

public async alreadyExists(sub: string) {
  try {
    let applicationUser: ApplicationUser = 
      await this.applicationUserService.getApplicationUser(sub).toPromise();

    if (applicationUser === null) {
      applicationUser = new ApplicationUser(sub);

      await this.applicationUserService.postApplicationUser(applicationUser)
       .toPromise();
    }
    localStorage.setItem('userId', sub);
  } catch (error) {
    this.errorMessage = error;
  }
}

我希望这会有所帮助

您的代码至少有三个问题

首先,您忽略了代码的异步性质,第二,您尝试写入一个空对象的属性,第三,您将错误回调作为成功回调传递给post

我不知道“sub”是什么,但你似乎把它用作用户ID,所以我也这么做了。这里有一个替代建议,它可以实现您想要做的事情。我使用async/await构造,而不是在Promissions中链接逻辑

public async alreadyExists(sub: string) {
  try {
    let applicationUser: ApplicationUser = 
      await this.applicationUserService.getApplicationUser(sub).toPromise();

    if (applicationUser === null) {
      applicationUser = new ApplicationUser(sub);

      await this.applicationUserService.postApplicationUser(applicationUser)
       .toPromise();
    }
    localStorage.setItem('userId', sub);
  } catch (error) {
    this.errorMessage = error;
  }
}

如果applicationUser==null{applicationUser.userId=sub;似乎可疑如果applicationUser==null为真,它将如何包含用户ID?对于初学者,我认为这应该是如果applicationUser!==null如果applicationUser==null{applicationUser.userId=sub;似乎可疑如果applicationUser==null为真,它将如何包含用户ID?对于初学者,我认为应该是如果applicationUser!==null,我认为本地存储应该设置在异步回调OPs意图之一的内部,+1Perhaps您是对的,但我将其保留为OP,因为它不严格我认为本地存储应该设置在异步回调OPs的意图中,+1也许你是对的,但我会把它保留为OP的,因为它不是严格的坏代码。@GSeriousB我认为它不会按你预期的方式工作,Hampus的回答陈述了你所有的错误。我会支持@echonax所说的。尽管它会我不再有运行时崩溃,它不会像你所想的那样工作。@GSeriousB我不认为它会像你所想的那样工作,汉普斯的回答陈述了你所有的误解。我会支持@echonax所说的。虽然它不再有运行时崩溃,但它不会像你所想的那样工作。