我正在使用@ angular / http get从服务器获取数据,这是我的代码:
private _currentPT: any;
public phongtroDetailChange = new Subject();
layPhongtro(id: number): Promise<any> {
return new Promise((resolve, reject) => {
this.http
.get(Constants.apiUrl + 'phongtro/' + id, { headers: Constants.headers })
.map((resp: Response) => resp.json())
.subscribe(resp => {
console.log(resp);
// if (!resp.result) {
// this._currentPT = resp;
// this.phongtroDetailChange.next(true);
// resolve(resp);
// } else {
// this.handleError('layPhongtro', resp.result);
// reject(resp.result);
// }
},
error => this.handleError('layPhongtro', error));
});
}
当我评论这样的代码时,resp的属性“tiencoc”具有正确的值,这意味着它的值为0,这是console.log的图片
https://i.stack.imgur.com/7oYGW.png
但是当我取消注释时,“tiencoc”的值与属性“giatien”相同,现在它的值为1000000,这里是取消注释时console.log的图片
https://i.stack.imgur.com/rGxdI.png
我不知道为什么?请帮助我,非常感谢你
P / s:我用POSTMAN测试过,resp没问题,这意味着“tiencoc”的值为0
答案 0 :(得分:0)
这里是演示的小提琴:https://jsfiddle.net/Lg6L8n2m/(在查看日志之前猜测值是什么:))
正如我在JSON.stringify
您正在打印该值的响应对象时所提到的注释(因为字符串在js中是不可变的)。但是没有stringify,console.log
实际上有点&#34;异步&#34;,console.log
打印对象具有的最新值。
因此,您要在tientoc
后的代码中将1000000
更改为console.log
。并且console.log会打印出最新的值。从我看到的可能是您订阅主题phongtroDetailChange
我建议在javascript中阅读关于此问题的Immutability。
答案 1 :(得分:0)
谢谢@echonax,我现在正在阅读“javascript中的不变性”,顺便说一句,我发现在子组件中我做到了这一点:
constructor(private ptService: PhongtroService) {
this.init();
}
ngOnInit() {
this.ptService.phongtroDetailChange.subscribe(result => {
if(result) {
this.init();
}
});
}
init() {
this.currentPT = this.ptService.currentPT;
if(!this.currentPT.tiencoc || this.currentPT.tiencoc === 0) {
this.currentPT.tiencoc = this.currentPT.giatien;
}
}
我已将ptService的currentPT存储在子组件的currentPT(this.currentPT)中,然后更改this.currentPT的值
和ptService
private _currentPT: any;
get currentPT(): any{
return this._currentPT;
}
set currentPT(pt) {
this._currentPT = pt;
}
并在layPhongtro函数上面
this._currentPT = resp;
this.phongtroDetailChange.next(true);
某些方式,子组件中的代码也会影响此resp