【问题标题】:variables not holding data in ionic angular不以离子角度保存数据的变量
【发布时间】:2018-07-19 19:12:08
【问题描述】:

我很困惑为什么变量不成立。
我有一个变量 user,它分配有 userData() 中的数据。但在构造函数和 ProfilePage 中的控制台日志时,它是未定义的。

share-service.ts

export class ShareService {
  uid: string;
  user;

  constructor(public db: AngularFireDatabase) {
    let currentUser = firebase.auth().currentUser;
    this.uid = currentUser.uid;
    this.userData();
    console.log('[constructor]user: ', this.user);
  }

  userData() {
    this.db.object(`users/${this.uid}`).snapshotChanges().subscribe(data => {
      this.user = data.payload.val();
      console.log('[userData]user: ', this.user);
    });
  }

  getUser() {
    return this.user;
  }

}

profile.ts

export class ProfilePage {
  user;

  constructor(public navCtrl: NavController, public firebaseService: FirebaseService, shareService: ShareService) {
    console.log('[profile.ts]', shareService.getUser());
  }

}
  • “angularfire2”:“5.0.0-rc.4”,
  • “firebase”:“4.8.2”,
  • “离子角”:“3.9.2”,
  • "rxjs": "^5.5.6",
  • "@ionic/app-scripts": "3.1.8",
  • “打字稿”:“2.4.2”

我已经尝试搜索类似的问题,例如 this 并读到它与角度如何异步有关,然后经过进一步调查,我读到 promise 需要像this。我还在某处读到应该使用 .then()

我尝试了几种方法来将它们实现到这个用例场景中,但结果都出现了语法错误。

需要建议,请。

【问题讨论】:

  • 我不知道你想做什么,但你在那里有一个可观察的,而不是一个承诺。你有什么问题?
  • @AlanGrosz 我有一个变量 user,它分配有 userData() 中的数据。但是在构造函数中控制台日志时它是未定义的
  • 您究竟想在哪里访问this.user?在构造函数中?
  • @SurajRao 通过导入import {ShareService } from '../../providers/share-service/share-service' 访问其他页面,然后通过调用shareService.getUser(); 获取
  • 检查我的答案.. 致电getUser().then(data=> //in here)

标签: javascript angular typescript asynchronous ionic-framework


【解决方案1】:

这是你的阅读方式..

 userData() {
    return this.db.object(`users/${this.uid}`).snapshotChanges()
    .pipe(map(data => {

      this.user = data.payload.val();
      return this.user;
      console.log('[userData]user: ', this.user);
    }));//import { map } from 'rxjs/operators/map';

}

如果您想在任何地方访问它,请在getUser() 上使用subscribe()

  getUser(){
    if(!this.user){
        return this.userData();//return the db call if not set
    }else{
    return of(this.user);//import {of} from 'rxjs/Observable/of;'
  }

在构造函数中,

  constructor(public db: AngularFireDatabase) {
    let currentUser = firebase.auth().currentUser;
    this.uid = currentUser.uid;
    this.getUser().subscribe(u=>{
        console.log('[constructor]user: ', u);
    });//subscribe to the observable.
  }

【讨论】:

  • 它不工作,console.log 甚至没有被调用。我该如何使用 async/await 来代替?
  • 没有被叫是什么意思?任何控制台错误?
  • 完全没有错误。.then里面的console.log没有被执行。
  • 对不起。我的错..它是return Promise.resolve(this.user);
  • 还是一样.. userData() { return this.db.object(users/${this.uid}).snapshotChanges().toPromise().then(data => this.user = data.payload.val(); console.log('[userData]user: ', data.payload.val()); return this.user; })}console.log inside userData() 我也没有被执行。
【解决方案2】:

Angular 为这种类型的 Async 方法提供了Async Pipe

用户信息将来自firebase服务器,这需要时间。
同时,javascript继续执行。

这就是为什么您将this.user 设置为undefined 的原因,因为当JS 执行该行时,数据不是来自服务器而不是分配给它。

所以我们需要通过

来处理这种类型的方法

所以 试试这个

share-service.ts

export class ShareService {
 uid: string;

 constructor(public db: AngularFireDatabase) {
 let currentUser = firebase.auth().currentUser;
 this.uid = currentUser.uid;
 }

 getUser() {
   return this.db.object(`users/${this.uid}`)
     .snapshotChanges()
     .map(data => data.payload.val());
 }
}

profile.ts

export class ProfilePage {
 user;

 constructor(public navCtrl: NavController, public firebaseService: 
  FirebaseService, shareService: ShareService) {
  this.user = shareService.getUser();
 }
}

在模板中

<div *ngIf="user | async as _user; else loadingUsers">
  {{_user.username}}
</div>
<ng-template #loadingUsers>
  Loading...
</ng-template>

【讨论】:

  • 它很简单而且很有效。但是如果我需要使用this.user.some_property 在代码中做一些逻辑呢?
  • 例如,在模板中&lt;div (click)="editUser(user)"&gt;edit&lt;/div&gt;this.user = shareService.getUser().map(user =&gt; this.data = user);
  • 这个blog post 会很有帮助
猜你喜欢
  • 1970-01-01
  • 2019-01-08
  • 2016-01-19
  • 2023-03-05
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多