У меня есть метод getUser в провайдере аутентификации (работает в Ionic 2):
getUser(uid: string): any {
var toReturn;
firebase.database().ref('/userProfile').orderByKey().equalTo(uid).once("value", function(snapshot){
toReturn = snapshot.val();
console.log("getUser = " + JSON.stringify(toReturn));
});
return toReturn;
}
Он извлекает объект пользователя из firebase. Он корректно выводится с помощью console.log, предоставляя его и сохраняется в переменной toReturn.
Ниже приведен класс ItemDetailPage, когда я регистрирую значение того же метода, он возвращает undefined.
import { Component } from '@angular/core';
import { NavParams} from 'ionic-angular';
import { Auth } from '../../providers/auth/auth';
@Component({
templateUrl: 'build/pages/item-detail/item-detail.html',
providers: [Auth]
})
export class ItemDetailPage {
private title;
private description;
private author;
constructor(private navParams: NavParams, private _auth: Auth) {
this.title = this.navParams.get('item').title;
this.description = this.navParams.get('item').description;
this.author = _auth.getUser(this.navParams.get('item').author);
console.log("item-detail.ts = " + JSON.stringify(this.author));
//_auth.getUser('123');
}
}
Я новичок в Angular и стараюсь учиться, когда я иду, так что это, наверное, что-то очень простое, я упускаю. Однако почему объект JSON не возвращается и не возвращается? Мне нужно, чтобы они использовали значения, запрашиваемые из базы данных.
благодаря
Что вам не хватает, так это то, что метод Firebase работает исправно. Таким образом, он возвращает обещание вместо ценности. Вот почему вы получаете возвращаемое значение в качестве обратного вызова.
Вы должны сделать это: вернуть обещание firebase в свою службу (или новое, если вы хотите что-то сделать с данными, прежде чем возвращать его в контроллер). Затем вы хотите создать функцию обратного вызова в контроллере.
return firebase.database().ref('/userProfile').orderByKey().equalTo(uid).once("value", function(snapshot){});
// Controller
_auth.getUser(this.navParams.get('item')).then(function(snapshot){
...
});
Вы должны взглянуть на то, как обещают работать в простом javascript:
http://andyshora.com/promises-angularjs-explained-as-cartoon.html
И тогда, как они используются в стиле NG2
http://coenraets.org/blog/2016/02/angular2-ionic2-data-services-promises-observables/