Javascript Firebase没有';t返回值(角度2)

Javascript Firebase没有';t返回值(角度2),javascript,angularjs,typescript,firebase,angular,Javascript,Angularjs,Typescript,Firebase,Angular,我尝试从Firebase中检索数据,它可以正常工作,但只适用于console.log()。 我无法将值返回到变量中 当我使用Angular 2和Typescript时,我有 服务: import {Injectable} from "angular2/core"; import 'rxjs/Rx'; import {Observable} from "rxjs/Observable"; declare var Firebase: any; @Injectable() export class

我尝试从Firebase中检索数据,它可以正常工作,但只适用于console.log()。 我无法将值返回到变量中

当我使用Angular 2和Typescript时,我有

服务:

import {Injectable} from "angular2/core";
import 'rxjs/Rx';
import {Observable} from "rxjs/Observable";
declare var Firebase: any;

@Injectable()
export class DataService {

    getAllData() {

        const firebaseRef = new Firebase('https://XYZ.firebaseio.com/path/user')
        firebaseRef.on("value", function (snapshot) {
            console.log(snapshot.val()); // THIS WORKS!
            return snapshot.val(); // THIS DOES NOT WORK!
        });
    }
和一个组件:

@Component({
templateUrl: 'templates/user.tpl.html',
providers: [DataService],
})

export class UserComponent implements OnInit{
userData: any;

constructor(private _dataService: DataService){}

ngOnInit():any {
    this.userData = this._dataService.getAllData(); 
    console.log(this.userData); // THIS DOES NOT WORK: UNDEFINED
}
如果我运行它,我的userData变量将一无所获。。。我想不出怎么解决这个问题。我想我需要一个可观察的,但我失败了,无论我想做什么


有人能帮忙吗?

由于Firebase是事件驱动的,您需要将您的呼叫包装成可观察的:

getAllData() {
  const firebaseRef = new Firebase('https://XYZ.firebaseio.com/path/user')
  return Observable.create((observer) => {
    firebaseRef.on("value", function (snapshot) {
        console.log(snapshot.val());
        observer.next(snapshot.val());

    });
  });
}
通过这种方式,您将能够通过订阅返回的可观察对象来接收值:

ngOnInit():any {
  this._dataService.getAllData().subscribe(data => {
    this.userData = data;
  }); 
}

谢谢它现在可以工作了,但不知何故,这些值不会显示在formbuilder的输入字段中(作为默认值):我添加了一个新问题:事实上,数据是异步加载的。所以当表单创建时,它不在那里。稍后我会更新输入(在订阅回调中),如下所示:
this.userForm.controls.username.updateValue(this.userData.username)