Angular订阅推送对象到数组

Posted

技术标签:

【中文标题】Angular订阅推送对象到数组【英文标题】:Angular subscribe push object to array 【发布时间】:2019-05-09 20:06:48 【问题描述】:

我正在制作角度应用程序,并且我有一个空数组,例如,

  users: any = [];

然后我在ngOnInit 中进行服务调用以将数据存储到users 数组中,例如,

  ngOnInit() 

    //Getting the data from json
    this.httpClient.get('https://api.myjson.com/bins/n5p2m').subscribe((response: any) => 
      console.log("response", response.data);
      response.data.forEach(element => 
        //Pusing the data to users array
        this.users.push(element);
      );
    )

    //Trying to get the complete array after push of the element from the service response data
    console.log("users array", this.users);
    //But it shows empty array
  

但我无法获取console.log("users array", this.users); 中的数据,因为服务调用延迟了..

如何将数据推送到this.users,当我们在服务外部调用时,它应该有填充的数据,而不是像现在这样为空..

还针对它进行了工作堆栈闪电战 https://stackblitz.com/edit/angular-q3yphw

请查看具有当前结果的控制台..

console.log("users array", this.users); 中的

当前结果是空数组[]

所以我期待console.log("users array", this.users);服务外和ngOnInit内出现以下结果

[
"id":1,"value":"User One",
"id":2,"value":"User Two",
"id":3,"value":"User Three"
]

由于我是 Angular 新手,请帮助我达到预期的结果..

【问题讨论】:

【参考方案1】:

分叉了你Stackblitz Demo

如果你想在 HTTP 客户端响应之后操作你的数据,你实际上可以通过使用 RxJS 操作符来实现。在管道内的这些方法之后,当您订阅其最终值时,它将直接呈现到您的模板。

this.httpClient
  .get('https://api.myjson.com/bins/n5p2m')
  .pipe(
    map(response => response.data),
    tap(users => console.log("users array", users))    // users array [Object, Object, Object]
  )
  .subscribe(users => this.users = users);

如果您不想使用 RxJS 运算符,您仍然可以在订阅其最终值并执行手动数据操作后对其进行操作

不需要执行 .forEach() 来存储 response.data 中的对象数组,因为 Angular 已经为您执行了它。因此,每当您将其分配为

this.users = response.data 它将存储您的对象数组[Object, Object, Object]

this.httpClient
  .get('https://api.myjson.com/bins/n5p2m')
  .subscribe(response => this.users = response.data);  // This will directly store your response data in an array of objects.

【讨论】:

this.httpClient .get('https://api.myjson.com/bins/n5p2m') .subscribe((response:any) => this.users = response.data); console.log("users array", this.users); 这个仍然显示空数组.. 我需要在服务调用之外,我需要在this.users..中获取填充数据。 这里例如我已经展示了这样,但在我的实际应用程序中,我需要循环遍历数组并将元素推送到它并获得最终结果.. 无论何时你想从 HTTP 获取一些东西,你都需要在里面订阅它的值并在那里执行你的数据操作。更新了我与服务集成共享的分叉 Stackblitz 演示链接,并使用了 Subject observable 谢谢..,但也保留RxJS operators stackblitz.. 我认为这是处理的最佳解决方案..【参考方案2】:

您也可以在没有循环的情况下将数据存储在数组中。

ngOnInit() 

  //Getting the data from json
  this.httpClient.get('https://api.myjson.com/bins/n5p2m').subscribe((response: any) =>       
    this.users.push(...response.data)
    console.log("users array", this.users);  
  )            

【讨论】:

【参考方案3】:

Angular 可以使用 Promises 和 Observables 来处理异步操作,例如这个 http get 请求。关于这个概念的信息很多,这里是一个很好的起点:Promise vs Observable

更详细地说,您可以将 http get 请求包装在一个返回 Observable 的方法中,然后订阅该方法并等待它返回结果,然后再执行 log 语句。

【讨论】:

以上是关于Angular订阅推送对象到数组的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 Angular 应用程序中订阅/收听 chrome 推送通知

Angular 2 在 ngOnInit 承诺中推送数组后不刷新视图

Angular 2 在 ngOnInit 承诺中推送数组后不刷新视图

Angular:如何订阅 @Input 更改

Angular 2:可观察订阅未正确读取数据[重复]

Angular,Socket.io:发出一个对象数组