【问题标题】:HTTP: Receiving an Array of Objects from serverHTTP:从服务器接收对象数组
【发布时间】:2016-05-21 06:40:36
【问题描述】:

我需要将后端连接到前端。我的前面是Angular2+TS。

所以问题出在服务和组件上。我不知道语法。

服务:

getCases(){
  return this.http.get('some URL')
  --- what code here? ---
}

目前我的组件看起来像:

export class CaseListComponent {
    name: string;
    id: string;
    time: string;
    cases: Observable<Case[]>;

    constructor(public _service: Service, public _router: Router) { 
        this.cases = this._service.getCases()
            .map((items) => items.map((item) => new Case(this.id, this.name, this.time)));
    }
}

目前构造函数中的代码出现编译错误:

““响应”类型上不存在属性“地图”。

所以显然我还需要在服务的getCases 方法中添加一些内容。

模板:

<table>
    <tr *ngFor="let case of cases | async">
        <td>{{case.name}}</td>
    </tr>
</table>

【问题讨论】:

  • 您的后端使用什么语言?您是否通过 http 请求数据?你的描述很模糊。你应该解释你的问题,而不是让别人举例。例如。您在使用 http 还是在服务器端发送数据时遇到问题?
  • 是的,我建议发送 JSON 并在您的服务器端实现一个简单的 RESTful API。 JSON 可读且易于处理。
  • 那么你发送什么格式? XML?
  • 您当然可以发送任何格式并在客户端处理您的数据。但在寻求帮助之前,我们需要更多关于您的数据等的信息。
  • 是的,我明白。我不够清楚,我的问题也没有说得足够清楚。仍在尝试找出从服务器端接收数据作为对象数组的语法。也许在我的头撞到墙上几天之后,我最终会弄明白(我希望)!

标签: typescript angular frontend backend objectmapper


【解决方案1】:

你的服务,意味着this.http.get('some URL') 返回一个 Observable。您在组件中要做的就是将该 Observable 存储在一个变量中,并在您的模板中与 async 管道结合使用它。如果您使用的是最新版本的 Angular 2,您必须执行以下操作:

export class MyComponent {
  public cases: Observable<Case[]>;

  constructor (private myService: MyService) {
    this.cases = myService.getCases()
                   .map((data) => data.cases.map((item) => new Case(...)));
  }
}

请注意,data 是您来自服务器的响应。由于我仍然不知道您的回复是什么样的,所以我举了一个例子。我假设在该 JSON 对象中有一个名为 cases 的属性,然后您可以将其 map 覆盖。查看您的响应对象并使用适当的密钥访问您的数据。

还将您的服务方法更改为以下内容:

getCases(){
  return this.http.get('some URL')
    .map((res: Response) => {
      let body = res.json();
      return body.data || { };
    });
}

在您看来,您可以使用您的数据并使用ngFor 循环它,如下所示:

<li *ngFor="let case of cases | async">
  {{ case }}
</li>

这里重要的一点是async 管道。你需要这个,因为你的财产是一个流。该管道订阅 Observable 并返回它发出的最新值。

注意

将 Observable 的类型更改为特定类型。我不知道您的数据是什么样的,所以我使用了any。如果可能,请始终明确说明您的类型。

【讨论】:

  • 非常感谢您的意见!尝试过您的示例,“this.cases”(在构造函数中)带有下划线并显示错误:[ts] 类型 'Observable' 不可分配给类型 'Observable'。类型“响应”不可分配给类型“案例 []”。 “响应”类型中缺少属性“长度”。 (属性)CaseListComponent.cases:Observable。甚至尝试使用“”类型。然后没有显示错误,但不起作用:(我使用 angular beta 17.
  • 一件事是该属性是private。我现在做了public,所以你可以在你的视图中访问它。你尝试了什么?如果您希望数组中的每个项目都是大小写类型,则必须转换响应。所以使用map 并将每个项目实例化为一个新的案例。
  • 我已经更新了我的答案并添加了一个创建新案例的转换。请将... 更改为您需要的。之后,您就有了一系列案例。
  • 非常感谢您花时间帮助我!现在我在 items.map((item): Property 'map' does not exist on type 'Response' 2.0.0-beta 17、rxjs 5.0.0-beta.2 和打字稿^1.8.9。
  • 下次,如果您提出问题,请添加更多信息,以便人们可以直接以答案的形式解决您的问题,而不是通过 cmets!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多