Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/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 如何从可观察角度分配局部变量2_Angular_Http - Fatal编程技术网

Angular 如何从可观察角度分配局部变量2

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

从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';
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
        });  
    }
}