Angular 如何从可观察角度分配局部变量2
从http响应中分配本地对象的正确方法是什么 我想将myUser对象分配给从http获得的响应,该响应的类型相同。这是我的密码:Angular 如何从可观察角度分配局部变量2,angular,http,Angular,Http,从http响应中分配本地对象的正确方法是什么 我想将myUser对象分配给从http获得的响应,该响应的类型相同。这是我的密码: import 'rxjs/add/observable/from'; import 'rxjs/add/observable/throw'; import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; import { Injectable } from '@angular/core'; imp
import 'rxjs/add/observable/from';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Injectable } from '@angular/core';
import { Headers, Http, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import { UpdateUser } from '../_models/updateuser';
@Injectable()
export class FormService {
private myUser : UpdateUser;
constructor(private http: Http) {
}
getUser(id: number): Observable<UpdateUser> {
const _url = 'https://192.168.1.2:4444/api/auth/getuser/' + id;
const headers = new Headers();
headers.append('X-User', sessionStorage.getItem('username'));
headers.append('X-Token', sessionStorage.getItem('token'));
headers.append('X-AccessTime', sessionStorage.getItem('AccessTime'));
headers.append('Content-Type', 'application/json');
const options = new RequestOptions({ headers: headers });
return this.http.get(_url, options)
.map(response => {
const responseAsObject = response.json();
this.myUser = responseAsObject; //<--- Here
console.log(this.myUser);
return responseAsObject;
});
}
logUser(){
console.log(this.myUser) //<--- undefined if called formService.logUser() from child components.
}
}
因此,我的最终目的只是让服务广播myUser,让子组件接收它,然后将其数据成员显示到表单中。但是,每当我将myUser分配给localUser时,它都显示为未定义。您可以尝试使用BehaviorSubject来存储user对象: 为您服务:
private myUser = new BehaviorSubject<UpdateUser>(null);
getUser() {
// ...
return this.http.get(_url, options)
.map(response => {
const responseAsObject = response.json();
this.myUser.next(responseAsObject); // change the value!
console.log(this.myUser);
return responseAsObject;
});
}
logUser() {
console.log(this.myUser.getValue());
}
另外,非常重要:您希望组件使用相同的服务实例,因此将其从两个组件的提供程序中删除,并将其添加到某个更高级别组件的提供程序中,以便它们共享一个实例。Do
const that=this在之前返回this.http.get(_url,options)
并替换this.myUser=responseAsObject
与that.myUser=responseAsObject代码>我是否对logUser()方法应用了任何更改?无需更改。问题是由异步行为引起的,而不是此
错误。请提供'child component'@BorisLobanov的代码,更新了child component的问题这会起作用,但我使用getUser从http获取用户对象,使用从模板传递的ID(编号)。在父组件中:this.formService.getUser(event.data.USER\u ID).subscribe,这意味着我还必须将event.data.USER\u ID传递给子组件。我的主要问题是首先将一个变量传递给子组件..嗯,myUser
属性在调用observable之前不会被初始化。您可以将其从父级传递到子级,也可以使用Subject存储用户。但在任何情况下,您都需要在子组件中订阅。在这种情况下,我如何使用主题来存储用户对象?我可以肯定地说,您掌握了我要查找的内容,但正在记录主题,而不是对象本身。它在oninit中返回null
private myUser = new BehaviorSubject<UpdateUser>(null);
getUser() {
// ...
return this.http.get(_url, options)
.map(response => {
const responseAsObject = response.json();
this.myUser.next(responseAsObject); // change the value!
console.log(this.myUser);
return responseAsObject;
});
}
logUser() {
console.log(this.myUser.getValue());
}
export class UpdateFormComponent implements OnInit{
private localUser : UpdateUser;
constructor(
private formService: FormService,
) {}
ngOnInit() {
this.formService.myUser
.filter(user => user !== null)
.subscribe(user => {
this.formService.logUser(); // also 'user' here is the user object from the service, you can do whatever you want with it
});
}
}