Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 8 getRole不是嵌套对象中的函数_Angular_Angular Http_Ngoninit - Fatal编程技术网

Angular 8 getRole不是嵌套对象中的函数

Angular 8 getRole不是嵌套对象中的函数,angular,angular-http,ngoninit,Angular,Angular Http,Ngoninit,我有一个API,它返回我的配置文件信息,我正在我的HTTP服务中获取它。嵌套对象User有一个方法getRole()。但是当我试图调用这个方法时,我得到 错误类型错误:_co.profile.user.getRole不是函数 当我从我的另一个服务获取User时,它只返回User实体,我可以调用这个函数,没有问题 我错过了什么 型号 导出类配置文件{ 用户:用户; ApiKey:ApiKey[]; } 导出类用户{ 用户:字符串; 名字:字符串; 姓氏:弦; 电子邮件:字符串; 角色:角色; 活动

我有一个API,它返回我的
配置文件
信息,我正在我的HTTP服务中获取它。嵌套对象
User
有一个方法
getRole()
。但是当我试图调用这个方法时,我得到

错误类型错误:_co.profile.user.getRole不是函数

当我从我的另一个服务获取
User
时,它只返回
User
实体,我可以调用这个函数,没有问题

我错过了什么

型号

导出类配置文件{
用户:用户;
ApiKey:ApiKey[];
}
导出类用户{
用户:字符串;
名字:字符串;
姓氏:弦;
电子邮件:字符串;
角色:角色;
活动:布尔值;
getRole(){
开关(this.role){
case Role.READ:{
返回“READ”;
}
case Role.WRITE:{
返回“写入”;
}
case Role.ADMIN:{
返回“ADMIN”;
}
默认值:{
返回“READ”;
}
}
}
}
ProfileService.ts

getProfile():可观察{
返回this.http.get(this.profileUrl).pipe(catchError(this.handleError));
}
组件。ts

profile:profile;
isProfileAvailable:boolean=false;
恩戈尼尼特(){
this.settingsService.getProfile().subscribe(profile=>{
this.profile=profile;
this.isProfileAvailable=true;
});
}
Component.html


用户:{{profile.User.firstname}
电子邮件:{{profile.user.email}
角色:{{profile.user.getRole()}

您当前没有创建类的实例,因此类方法
getRole()
不可用。使用
this.http.get
您只是告诉编译器您期望从API获得的内容符合您的类,它实际上并没有创建类或子类
User
的实例

您需要向具有属性的类添加构造函数,并实际创建类的实例。下面是一个简化的示例:

导出类用户{
角色:字符串;
构造函数(角色:字符串){
this.role=角色;
}
getRole(){
开关(this.role){
案例“已读”:{
返回“READ”;
}
案例“写入”:{
返回“写入”;
}
默认值:{
返回“READ”;
}
}
}
}
然后需要创建类的实例以访问类方法:

ngOnInit(){
让用户=新用户(“写入”);
log(user.getRole());
}

此外,如果这是类中唯一需要的方法,我建议您使用接口,编写一个独立的函数来检查角色,而不是麻烦地创建类实例。但这是一个非常固执己见的观点,因此如果您想使用类和特定于类的方法,您确实需要遵循上述路线。我只是喜欢亲自使用接口:)

调用
http.get
不会自动初始化
Profile
类型的对象,因此属性
user
也不是
user
类型的对象,也没有方法
getRole

可以使用初始化对象及其属性。因为有两种类类型(
Profile
User
),所以这两种类型都可以从
基本类扩展来处理这两种类型的属性分配

型号:

//使用基类为所有属性分配类型为Profile和User的对象
阶级基础{
构造函数(属性?:任何){
(任何对象)。分配(此,属性);
}
}
导出类用户扩展基{
用户:字符串;
名字:字符串;
姓氏:弦;
电子邮件:字符串;
角色:角色;
活动:布尔值;
getRole(){
开关(this.role){
case Role.READ:{
返回“READ”;
}
case Role.WRITE:{
返回“写入”;
}
case Role.ADMIN:{
返回“ADMIN”;
}
默认值:{
返回“READ”;
}
}
}  
}
导出类概要文件扩展了基本类{
用户:用户;
ApiKey:ApiKey[];
//利用Object.assign
//初始化Profile类型的实例的步骤
//以及它的属性用户
构造函数(属性?:任何){
超级(物业);;
this.user=新用户(properties.user);
}
}
ProfileService.ts

getProfile():可观察{
返回this.http.get(this.profileUrl).pipe(catchError(this.handleError));
}
组件。ts

profile:profile;
isProfileAvailable:boolean=false;
恩戈尼尼特()
{
this.settingsService.getProfile().subscribe(profileData=>{
//假设profileData如下所示:
/*
{
用户:{
用户:“用户”,
名字:“名字”,
姓:“姓”,
电子邮件:“电子邮件”,
主动:正确
}
}
*/
this.profile=新配置文件(profileData);
this.isProfileAvailable=true;
});
}
答案很有魅力

但是,由于我的所有模型都在单独的文件中,因此我必须导出基类:

导出类基{
构造函数(属性?:任何){
(任何对象)。分配(此,属性);
}
}

一切正常。

请就我们的答案提供一些反馈。谢谢大家!@Blauharley这些天我一直很忙,但我会尽快尝试你的解决方案并给你反馈。请给出一些反馈。@Blauharley抱歉等了这么久,我终于有时间看看你的解决方案了。非常感谢,成功了!不客气。谢谢!