Angular 2-TypeError:无法设置未定义的属性“userId”
我创建了一个模型,在一个方法中,当我想给模型的属性赋值时,我得到了这个错误:TypeError:无法将属性“userId”设置为undefined 这是我的模型: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
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所说的。虽然它不再有运行时崩溃,但它不会像你所想的那样工作。