我想在初始化用户组件时进行一次REST调用,这样它将在加载时显示用户配置文件。这工作正常,该组件调用该服务,该服务调用了我的快速后端,而该后端又对返回用户配置文件的REST-API进行了调用。然后前端就会更新。
但是,我收到一个JavaScript错误,因为在发送数据之前,前端尝试在用户组件html模板中使用user.id:
UserComponent.html:2 ERROR TypeError: Cannot read property 'id' of undefined
at Object.eval [as updateRenderer] (UserComponent.html:2)
at Object.debugUpdateRenderer [as updateRenderer] (core.js:20458)
at checkAndUpdateView (core.js:19833)
at callViewAction (core.js:20069)
at execComponentViewsAction (core.js:20011)
at checkAndUpdateView (core.js:19834)
at callViewAction (core.js:20069)
at execComponentViewsAction (core.js:20011)
at checkAndUpdateView (core.js:19834)
at callViewAction (core.js:20069)
我试图通过添加要在加载用户时使用的默认值来解决此问题 这是我的HTML:
<ul>
<li>id: {{user.id ? user.id : ''}}</li>
<li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
<li>mail: {{user.email ? user.email : ''}}</li>
</ul>
这是组件。
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
user: User;
constructor(private userService: UserService) { }
ngOnInit() {
this.userService.getUser().subscribe(user => {
console.log('myUser: ' + JSON.stringify(user));
this.user = user;
});
}
}
service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { map, catchError, tap } from 'rxjs/operators';
import { User } from '../classes/user';
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private http: HttpClient) { }
getUser(): Observable<User> {
return this.http.get<any>('/api/userprofile');
}
}
和服务器端代码
router.get('/userprofile', (req, res) => {
axios.get('https://somerestapi', {auth: {username: 'authuser', password: 'authuserpw'}})
.then(response => {
res.status(200).json(response.data)
})
.catch(error => {
res.status(500).send(error);
})
})
谢谢!
答案 0 :(得分:3)
可以将* ngIf =“ user”放在ul
元素上。或在HTML中的每个user
之后加上问号。 <li>id: {{user?.id}}</li>
答案 1 :(得分:1)
<ul *ngIf="user">
<li>id: {{user.id ? user.id : ''}}</li>
<li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
<li>mail: {{user.email ? user.email : ''}}</li>
</ul>
您可以在ngOnInit内部调用一个函数,如下所示
ngOnInit() {
this.userService.getUser().subscribe(user => {
console.log('myUser: ' + JSON.stringify(user));
this.assignUser(this.user) ;
});
}
//function to assinging user value
assignUser(user){
this.user= user;
}
答案 2 :(得分:1)
尝试在以下html代码段中使用:
<ul>
<li>id: {{user?.id}}</li>
<li>name: {{user?.firstName}} {{user?.lastName}}</li>
<li>mail: {{user?.email}}</li>
</ul>
或
<ul *ngIf="user.length >0">
<li>id: {{user.id ? user.id : ''}}</li>
<li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
<li>mail: {{user.email ? user.email : ''}}</li>
</ul>
答案 3 :(得分:0)
尝试检查user
数组的长度
<ul *ngIf="user.length >0">
<li>id: {{user.id ? user.id : ''}}</li>
<li>name: {{user.firstName ? user.firstName : ''}} {{user.lastName ? user.lastName : ''}}</li>
<li>mail: {{user.email ? user.email : ''}}</li>
</ul>