【问题标题】:Asynchronous method doesn't work the first time异步方法第一次不起作用
【发布时间】:2021-12-18 00:57:39
【问题描述】:

我是 Firebase 的新手。我正在使用 Firestore 数据库和 Ionic,我在异步调用时遇到了这个问题,但我无法解决。基本上在 item 变量中是我保存在 firestore 数据库中的数据。但是当我想通过一个按钮显示它们时,在一个新的 html 页面中发生了一件奇怪的事情,在 url 中,传递的参数立即出现并消失,不再起作用。过去我有一个类似的问题,我使用角管道 "async" 解决了这个问题,但在这种情况下它甚至不起作用。 详细来说,我有一个组件中的项目列表:

  ngOnInit() {
    this.itemService.getItemsList().subscribe((res)=>{
      this.Tasks = res.map((t) => {
        return {
          id: t.payload.doc.id,
          ...t.payload.doc.data() as TODO
        };
      })
    });
    
  } 

在 item.service.ts 我已经定义了函数:

constructor(
    private db: AngularFireDatabase,
    private ngFirestore: AngularFirestore,
    private router: Router
) { }

  getItemsList() {
    return this.ngFirestore.collection('items').snapshotChanges();
  }
  getItem(id: string) {
        return this.ngFirestore.collection('items').doc(id).valueChanges();
      }

对于每个项目,我都有一个按钮来显示详细信息:

<ion-card *ngFor="let item of Tasks" lines="full">
....
<ion-button routerLinkActive="tab-selected" [routerLink]="['/tabs/item/',item.id]" fill="outline" slot="end">View</ion-button>

在组件 itemsDescription.ts 我有:

  ngOnInit() {
    this.route.params.subscribe(params => {
      this.id = params['id'];
      });
    this.itemService.getItem(this.id).subscribe((data)=>{
    this.item=data;
    });  
  }
 

终于在html页面中:

    <ion-card-header>
      <ion-card-title>{{item.id}}</ion-card-title>
    </ion-card-header>
    <ion-icon name="pin" slot="start"></ion-icon>
        <ion-label>{{item.Scadenza.toDate() | date:'dd/MM/yy'}}</ion-label>
    <ion-card-content>{{item.Descrizione}}</ion-card-content>

显示了 Scadenza 和 Descrizione 信息,而不是 id。 url 也应该是 tabs/items/:id 但是当我点击按钮显示项目信息时,传递的参数立即消失,只显示 tabs/items。如果我将数据删除到 {{}} 中,则 url 中的参数不会消失

已解决 我遵循了本指南https://forum.ionicframework.com/t/async-data-to-child-page-with-ionic5/184197。所以放? ,例如 {{item?.id}} 现在一切正常

【问题讨论】:

    标签: javascript firebase asynchronous ionic-framework google-cloud-firestore


    【解决方案1】:

    您的嵌套代码顺序不正确。订阅后会得到id的值。

    检查此代码:

      ngOnInit() {
        this.route.params.subscribe(params => {
          this.id = params['id'];
     this.profileService.getItem(this.id).subscribe((data)=>{
        this.item=data;
        });  
          });
       
      }
    

    【讨论】:

    • 感谢您的回复。我尝试了这个修改,但没有任何改变,来自 url 的参数总是消失
    • 检查您是否已使用 console.log(params[id]) 从路由正确接收到 id。如果它未定义,那么您有角度路由配置问题。
    • 我收到它并且打印正确。我注意到问题是当我将“项目”数据放在 html 页面的大括号中时。如果我删除它,则 url 可以正常工作。一旦我把它放回去,“id”参数就会从 url 中消失。这是一个谜。
    • 分享有关您的代码的更多详细信息,然后我们将有更多机会解决您的问题。编程没有奥秘,它本身就是奥秘:)
    • 真 =) 。好的,我会编辑帖子,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多