如何创建对象数组或使用模型,就像我们在 JSON 中一样 - Angular/Ionic

Posted

技术标签:

【中文标题】如何创建对象数组或使用模型,就像我们在 JSON 中一样 - Angular/Ionic【英文标题】:how to create an array of objects OR use models, just like we have in a JSON - Angular/Ionic 【发布时间】:2020-01-19 15:58:51 【问题描述】:

import  Storage  from '@ionic/storage';
import  Component, OnInit  from '@angular/core';
import  ActivatedRoute, Route  from '@angular/router';
import  HttpClient, HttpParams  from '@angular/common/http';
import  __core_private_testing_placeholder__  from '@angular/core/testing';
import  ModalController, NavController  from '@ionic/angular';

@Component(
  selector: 'app-matchfixer',
  templateUrl: './matchfixer.page.html',
  styleUrls: ['./matchfixer.page.scss'],
)
export class MatchfixerPage implements OnInit 
  id1: any;
  id2: any;
  url: string;
  fixture: any[]=[];
  venue: any[]=[];
  venueUrl: any;
  player: any[]=[];
  playerUrl: any;
  toss: any[]=[];
  teams: any[]=[];
  
  constructor(
    private storage: Storage,
    public http: HttpClient,
    public navCrl: NavController
    ) 

  async delay(ms: number) 
        await new Promise(resolve => setTimeout(()=>resolve(), ms)).then(()=>console.log('fired'));
    

  goconsl()
    console.log(''+this.id1+''+this.id2);
  

  goback()
    this.navCrl.pop();
    this.navCrl.navigateRoot('/home');
  

  fetchVenue()
    this.fixture.forEach((item,index) => 
      if(item.status!='NS')  
      this.venueUrl='https://cricppp.herokuapp.com/users/venue/'+item.venue_id;
      this.http.get(this.venueUrl).subscribe(response => 
        this.venue[index]=response["name"];
        //this.venue[index]=response;
        console.log('venue '+this.venue[index]+' '+index);
      );
    
    else
    
      this.venue[index]='no venue/no match';
      console.log('venue '+this.venue[index]+' '+index);
    
    );
  

  fetchPlayer()
    this.fixture.forEach((item,index) => 
      if(item.status!='NS')  
      this.playerUrl='https://cricppp.herokuapp.com/users/player/'+item.man_of_match_id;
      this.http.get(this.playerUrl).subscribe(response => 
        this.player[index]=response["fullname"];
        console.log('player '+this.player[index]+''+index);
      );
    
    else
    
      this.player[index]='no pop/no match';
      console.log('player '+this.player[index]+''+index);
    
    );
  

  fetchToss()
    this.fixture.forEach((item,index) => 
      if(item.status!='NS')  
      this.http.get('https://cricppp.herokuapp.com/users/teams').subscribe(response => 
        this.teams=response["teams"];
        this.teams.forEach((itm,indx) => 
          if(itm.id==item.toss_won_team_id)
            this.toss[index]=itm.name;
            console.log('toss '+this.toss[index]+''+index);
          
        );
      );
    
    else
    
      this.toss[index]='no toss/no match';
      console.log('toss '+this.toss[index]+''+index);
    
    );
  

  ngOnInit() 

    this.storage.get('team1Id').then(paras1 => 
      this.id1=paras1;
    );
    this.storage.get('team2Id').then(paras2 => 
      this.id2=paras2;
    );
    this.delay(1000).then(any=>
      this.url = 'https://cricppp.herokuapp.com/users/fixtures/'+this.id1+'/'+this.id2;
      this.http.get(this.url).subscribe(response => 
        this.fixture = response["allFixtures"];
        console.log(this.fixture[0].note);
        this.fetchVenue();
        this.fetchPlayer();
        this.fetchToss();
        );
    );
  

这里我有 3 个最终数组 player[]。折腾[]。 &场地[] 我想使用 ngFor 在 html 中按顺序显示它们,但 ngFor 只能遍历 1 个数组 (我想像- player[0]->toss[0]->venue[0] ------- player[1]->toss[1]->venue[1]...一样显示它们 等等……

我正在研究模型和/或对象数组,但我什么都做不了,我想要一个类似的模型

export class Data
    public venue: string;
    public toss: string;
    public player: string;
    

但由于我是新手,所以我无法让它工作,每当我尝试使用 forEach 分配数据时,它都会显示错误 this.data[index] 未定义。 (我在做数据:Data[]=[];)(我也导入了模型) 我希望我解释正确,我想创建一个数组,其中每个元素都有 3 个属性场地、投掷和玩家,我可以为其分配值。 喜欢this.data[index]="response from API"; 就像 json 一样,我也尝试查看对象数组,但我无法让它工作。 我还阅读了有关服务的信息,但我无法让这个简单的东西工作,所以我也无法处理服务。 请帮忙

【问题讨论】:

【参考方案1】:

首先,您正在进行多个异步调用,这些调用可能会在不同的时间完成获取数据。

因此,确定您已收到来自所有呼叫的所有数据是一件棘手的事情。你可能想使用Promise.all(),或者RxJS的forkJoin(), 或类似的东西。

假设所有数据都已获取并且可用,您可以根据需要创建一个新的Data[] 数组。或者,如果所有这些数组的长度相同,那么您可以同时遍历所有这些数组。

*ngFor 对数组等可迭代对象进行迭代,但您也可以使用索引来访问其他数组中的值。

例如,

<ng-container *ngFor="let value of player; let i = index">
  <div>player[i]</div>
  // Can use the same index on other arrays.
  <div>toss[i]</div> 
  <div>venue[i]</div> 
</ng-container>

但是如果数组的长度不同,那么你会得到undefined 值。

我没有看到您将数据推送到 data[] 数组的代码,但您可以执行类似的操作

var data = [];

for (let i = 0; i < player.length; i++) 
  data.push(
    "venue": venue[i],
    "toss": toss[i],
    "player": player[i]
  );

然后使用*ngFor 遍历这个data[] 数组以显示值。

<ng-container *ngFor="let value of data; let i = index">
  <div>data[i].player</div>
  <div>data[i].toss</div> 
  <div>data[i].venue</div> 
</ng-container>

【讨论】:

在不同时间获取数据在我的情况下也不是问题,我正在制作的应用程序不是什么大事,我只需要数据到达那里,以便我可以使用数据显示它可用时绑定。 Promise 和 rxjs 离我的范围有点远,我还在学习。 是的,但在您的情况下知道数据可用并不容易。如果您尝试在数据可用之前使用它,您将遇到undefined 错误。渲染视图也会引发错误,但作为一种快速而肮脏的修复,您可以使用带有多个布尔标志的 *ngIf 我不知道 ngFor 可以用来迭代其他数组。数组长度相同(最后)“我没有看到您将数据推送到 data[] 数组的代码” - 那是因为我做不到。我会试试你建议的这些并报告,谢谢! promise/forkjoin 对我来说太复杂了。第二种方法适用于我想要显示数据的方式。谢谢。我尝试了最后一种推送的方法,它也有效,但是我发现前一种更简单,感谢您提供这两种解决方案。 是的,我明白了。随着您的逐步进步,您可以了解 Promise 和 observables。不客气。我很高兴它有所帮助。

以上是关于如何创建对象数组或使用模型,就像我们在 JSON 中一样 - Angular/Ionic的主要内容,如果未能解决你的问题,请参考以下文章

laravel怎么把对象转换为数组

如何更新 json 类型的 json 中的任何字段?它应该接受一个对象或一个键数组,如果它存在则更新键,否则创建

如何使用 SwiftyJSON(在 Swift 中)基于 JSON 对象数组创建对象数组?

查找 MySQL JSON 对象或数组的交集

如何在运行时使用 jquery 创建 json 对象数组?

Java POJO的JSON对象数组