Angular2 HTTP GET - Cast response into full object
Angular2 HTTP GET - Cast response into full object
我有一个简单的组件
import {Component} from 'angular2/core'; import {RouterLink, RouteParams} from 'angular2/router'; import {Http, Response, Headers} from 'angular2/http'; import {User} from '../../models/user'; import 'rxjs/add/operator/map'; @Component({ template: `{{user.name}} {{user.surname}}
`, directives: [RouterLink], }) export class UserComponent { user: User; constructor(private routeParams: RouteParams, public http: Http) { this.user = new User(); this.http.get('http://localhost:3000/user/' + this.routeParams.get('id')) .map((res: Response) => res.json()) .subscribe((user: User) => this.user = user); console.log(this.user); } }
为什么subscribe
没有将响应转换为完整的User
对象。当我记录user
变量时,我的控制台显示User {_id: undefined, name: undefined, surname: undefined, email: undefined}
。但是尽管如此,在视图中绑定到.name
和.surname
仍然有效。
这里发生了什么?用户实际上存储在哪里?
问题的出现原因是作者希望将HTTP GET请求的响应转换为完整的对象。根据Angular文档的建议,最佳实践是使用Observable
如果GET方法需要返回一个Model数组,那么这种方法也可以正常工作,只需要将User替换为User[]即可。
需要注意的是,TypeScript没有运行时类型检查,所以类型注解的变量不一定是类的实例。例如Angular教程中的hero对象,它只是一个类型注解的变量,并不一定是Hero类的实例。
问题的作者遇到的问题是他的log命令在响应到达之前就被执行了。这与你的答案无关。此外,他要求一个"完整的User对象",我理解为User类的实例。所以即使他的log命令在正确的位置,你的答案也是错误的,因为它将返回一个普通对象,而不是User类的实例。
最后,有一个回答者登录并点赞了你的答案,因为它确实对他有帮助。
将任意对象(来自响应)强制转换为Users类。这将导致一个Partial
Angular2 HTTP GET - Cast response into full object这个问题的出现的原因是因为在接收到HTTP GET请求的响应之前,控制台就已经打印了一个未定义的用户对象。即使在正确的位置执行了console.log语句,也会被一个普通对象(this.user = user)覆盖掉,而这个对象不再是User的实例。这个问题的解决方法是将响应数据转换为User对象。
解决方法是在构造函数中使用HTTP GET请求获取用户数据,并使用map()方法将响应转换为JSON对象。然后,通过订阅subscribe()方法,将JSON对象传递给User的fromJSON()方法,将其转换为完整的User对象。
在这个解决方法中,还对Serializable类进行了增强,在fromJSON()方法中返回了对象本身,这样就可以直接调用new User().fromJSON(json)来转换JSON对象。
在Angular 6中,map()方法的使用方式发生了变化,需要注意。
总结一下,从这个解决方法中可以得出以下结论:
1. 在获取HTTP响应之前打印对象会导致对象为undefined。
2. 使用map()方法将响应转换为JSON对象。
3. 使用subscribe()方法将JSON对象传递给fromJSON()方法进行转换。
4. 可以对Serializable类进行增强,使其返回对象本身。
5. 在Angular 6中,map()方法的使用方式发生了变化。
根据经验来看,原始问题的根源在于其他错误。
以上就是关于Angular2 HTTP GET - Cast response into full object问题的原因和解决方法的整理。
Angular2中的HTTP GET请求返回的响应数据无法直接转换成完整的对象,这是由于TypeScript本身的限制。在这个问题中,用户尝试将返回的JSON对象转换成一个TypeScript类的实例,但是无法直接进行类型转换。虽然绑定到数据的过程可以正常进行,但是绑定的变量在日志中被打印出来却是undefined。这是因为JSON和对象在TypeScript/JS中是可以互换的,但是创建的对象只包含JSON中的字段,而不包含在实际类的原型中定义的方法或其他字段。
解决方法是在订阅HTTP请求的回调函数中进行类型转换。首先,将数据转换成一个新的User对象,并将其赋值给this.user。然后,在回调函数中打印this.user的值。这样就可以正确地获取到绑定到视图中的对象。
另外,还有一个错误是在执行日志打印语句之前执行了HTTP请求。由于this.http.get()是异步的,它会将任务放入浏览器的事件队列中以供稍后执行,然后继续执行JS代码(包括日志命令)。当HTTP请求完成时,传递给.subscribe(...)的回调函数才会被执行,但是这个执行过程要晚很多。因此,需要将日志打印语句放入.subscribe((user: User) => { ... });中,以确保在获取到响应数据后再进行打印。