【问题标题】:How can I combine two data stores in angular?如何以角度组合两个数据存储?
【发布时间】:2018-02-14 05:46:52
【问题描述】:

我有这个服务可以从 django rest api 获取对象列表。

import {Injectable} from '@angular/core';
import {Headers, Http} from '@angular/http';
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';
import {environment} from '../../../environments/environment';
import {Delegation} from "../delegations/delegation";

@Injectable()
export class DelegationsService {

  private headers = new Headers({'Content-Type': 'application/json'});

  constructor(private http: Http) { }

  getDelegations(userid: number)  {
    return this.http.get(environment.apiUrl + '/api/v1/delegations/' + userid )
      .map(res => <Delegation[]>res.json());
  }
}

../delegations/delegation.ts的内容是:

export class Delegation {
  id: number;
  delegator: number;
  delegatee: number;
}

委托人和被委托人的数字是“用户”的数据库 ID。我需要显示可通过另一个 REST API url 获得的实际用户名和登录 ID。我想我可以将../delegations/delegation.ts 修改成这样:

export class Delegation {
  id: number;
  delegator: number;
  delegator_login: string;
  delegator_name: string;
  delegatee: number;
  delegatee_login: string;
  delegatee_name: string;
}

然后我会迭代从this.http.get(environment.apiUrl + '/api/v1/delegations/' + userid ) 调用中获得的元素并请求用户信息,但我不知道如何迭代结果集。

更新:

目前我可以将委托人数据转储到我的delegations.component.html模板和网页显示:

2 | 97597 | 5197 
4 | 97597 | 9757 

我要显示的是:

2 | Sam Smith (ssmith) | Lisa Butts (lbutts) 
4 | Sam Smith (ssmith) | Bill Fatlips (bfatlips) 

我的delegations.component.html很简单:

<ul class="delegations">
  <li *ngFor="let delegation of delegations" [class.selected]="delegation === selectedDelegation" (click)="onSelect(delegation)">
    <span class="badge">{{delegation.id}}</span> | {{delegation.delegator}} | {{delegation.delegatee}}
  </li>
</ul>

这几乎就是他们在 Heroes Angular 中的内容:https://angular.io/tutorial/

【问题讨论】:

  • 所以基本上你需要显示你从 API 获得的数据?
  • 我得到的数据只是数据库记录ID。我需要使用这些 id 来查找实际的用户名,而不仅仅是他们的 db 记录的 id。
  • 很抱歉,我不明白“”是什么意思。我需要使用这些 id 来查找实际的用户名,而不仅仅是他们的 db 记录的 id。”
  • 对不起。我将更新我的问题,以更清楚地说明我想要做什么。
  • 您也可以发布您的 HTML 文件吗?

标签: angular


【解决方案1】:

尝试这样做:

getDelegations(userid: number)  {
    return this.http.get(environment.apiUrl + '/api/v1/delegations/' + userid )
      .map(res => {
        const theList = <any[]>res.json();
        theList.forEach(item => {
          this.http.get(environment.apiUrl + '/api/v1/delegaor/' + item.delegator)
              .map(res2 => {
                const delegator = res2.json();
                item.delegator_login = delegator.login;
                item.delegator_name = delegator.name;
              });
          this.http.get(environment.apiUrl + '/api/v1/delegatee/' + item.delegatee)
              .map(res3 => {
                const delegatee = res3.json();
                item.delegatee_login = delegatee.login;
                item.delegatee_name = delegatee.name;
              })
        })
        return theList;
      } )
      .subscribe(finalList => {
        // this finalList is your delation list with names and logins and ids
      });
  }

我有点担心 finalList 会在内部 api 调用之前返回,但我认为订阅会在返回之前等待它全部完成。这个解决方案当然是假设您将字符串添加到您的委托类中。

【讨论】:

  • 不错!但是我已经能够说服后端开发人员进行更改,以便我将获得我需要在初始 API 请求中显示的所有信息。他们担心与潜在的大量 API 请求相关的性能问题。
  • 这将是最好的解决方案,将其全部从原始调用中返回。不确定您是否使用了您无法控制的 API
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2011-04-09
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多