【问题标题】:Iterate over json with angular 7 using services使用服务使用 Angular 7 迭代 json
【发布时间】:2019-09-08 16:51:56
【问题描述】:

我有一个返回以下 JSON 的节点服务器:

{
        "ResponseStatus": {
          "ResponseCode": 0,
          "ResponseMessage": "Success."
        },
        "Events": [
          {
            "CodEspec": 65957,
            "NomeEspec": "O PIOR ESPETÁCULO DO MUNDO",
            "DiaHoraEspecs": [
              "2019-05-09T21:30:00",
              "2019-05-10T21:30:00",
              "2019-05-25T21:30:00"
            ]
          },
          {
            "CodEspec": 01234,
            "NomeEspec": "O MELHOR ESPETÁCULO DO MUNDO",
            "DiaHoraEspecs": [
              "2019-05-09T21:30:00",
              "2019-05-10T21:30:00",
              "2019-05-25T21:30:00"
            ]
          },

        ]
      }

我创建了一个执行 GET 并返回 JSON 的 Angular 服务。

tickeline.service.ts

getEventos():Observable<Event[]>{
    //get todos os eventos
    return this.http.get<Event[]>(this.url_node, httpOptions);
  }

还为事件创建了一个模型,只获取某些参数:

events.ts

export class Event{

  CodEspec: number;
  NomeEspec: string;
  DiaHoraEspecs: Date[];

}

在我想要显示 JSON 的事件组件中,我从服务中调用函数 geteventos。

events.component.ts

export class EventsComponent implements OnInit {

  events: Event[];

  constructor(private ticketlineservice: TicketlineService) { }

  ngOnInit() {
    this.ticketlineservice.getEventos().subscribe(events => {
      this.events = events;
    });
  }
}

events.component.html

<div class="text-center">
    <ul *ngFor="let event of events">
        <li class="btn bg-primary text-center">
            <h2>Evento:</h2> 
            <p>{{ event.NomeEspec }}</p>
            <p>{{ event.CodEspec }}</p>
            <p>{{ event.DiaHoraEspecs }}</p>
        </li>
    </ul>
</div>

问题:为每个 Event 对象创建一个带有相应信息的 li 元素。目前它只在 li 元素上创建,不显示 JSON 信息

【问题讨论】:

  • 你重复uls而不是lis,把你的*ngFor放在li
  • eventssubscribe中返回的内容是什么?
  • subscribe 返回一个数组,里面有两个数组,其中两个是每个事件的信息
  • @LuisMaia 但您显示了 JSON 响应,并且里面没有包含数组的数组。您应该清楚您得到的确切响应。
  • @porgo 返回以下内容:0: Events: Array(2) 0: {...} 1: {...}

标签: node.js json angular


【解决方案1】:

您的问题有两个部分。

请从响应中选择 Events 数组并将其分配给 event.component.ts

中的 events 类级别变量
export class EventsComponent implements OnInit {

  events: Event[];

  constructor(private ticketlineservice: TicketlineService) { }

  ngOnInit() {
    this.ticketlineservice.getEventos().subscribe(events => {
      this.events = events.Events;// This is the change for getting only events from the response
    });
  }
}

这样你将只有事件数组而不是整个响应。

第二步是如 main 所指出的,在 li 而不是 ul 上运行一个循环,如下所示:

<div class="text-center">
        <ul>
            <li class="btn bg-primary text-center" *ngFor="let event of events">
                <h2>Evento:</h2> 
                <p>{{ event.NomeEspec }}</p>
                <p>{{ event.CodEspec }}</p>
                <p>{{ event.DiaHoraEspecs }}</p>
            </li>
        </ul>
    </div>

我想再添加一个好的做法,那就是添加 elvis 运算符或安全运算符,这样你的 HTML 就不会失败。

event.NomeEspec ---> event?.NomeEspec

这样,如果事件是未定义,那么我们就可以安全地访问事件对象的属性了。

更新

getEventos():Observable<Event[]>{
    //get todos os eventos
    return this.http.get<Event[]>(this.url_node, httpOptions);
  }

在这里,您正在输入对 Event[] 的响应,您将不得不进行一些更改,如下所示。

**getEventos():Observable<Event[]>{
    //get todos os eventos
    return this.http.get<Event[]>(this.url_node, httpOptions).map(response=> response.Events);// map operstor takes your response and sends the Events array as a part of the response for your HTTP call.
  }**

【讨论】:

  • 我已经更改了 html,但是当我将 event.component.ts 更改为 this.events = events.Events; 时,它返回以下错误 Property 'Events' does not exist on type 'Event[]'.
  • 嗨@LuisMaia 我已经更新了答案,请检查是否有帮助。您需要在输入this.http.get&lt;Event[]&gt; 时所做的响应之前从响应中选择事件数组。所以请查看更新了 asnwer,如果有帮助,请告诉我。
【解决方案2】:

在这个 json 中,您呈现的 Events 是一个属性。所以你应该从events 中的subscribe 获得这个属性:

this.ticketlineservice.getEventos().subscribe(events => {
  this.events = events.Events;
});

但是如果您收到数组作为响应,其中包含 Events 属性(正如您在评论中提到的那样),您应该这样做:

this.ticketlineservice.getEventos().subscribe(events => {
  this.events = events[0].Events;
});

您还应该在进一步的步骤中更改返回类型getEventos():Observable&lt;Event[]&gt;,因为正如您所展示的那样,这不是真的(根据此示例 JSON 响应)。您没有返回 Event 数组。

在 HTML 文件中,您也应该像 @Dusan Radovanovic 一样进行更改作为他的答案。所以它应该是这样的:

<div class="text-center">
  <ul>
    <li class="btn bg-primary text-center" *ngFor="let event of events">
      <h2>Evento:</h2> 
      <p>{{ event.NomeEspec }}</p>
      <p>{{ event.CodEspec }}</p>
      <p>{{ event.DiaHoraEspecs }}</p>
    </li>
  </ul>
</div>

【讨论】:

  • 在事件模型中我需要改变什么?因为我收到以下错误Type 'Event' is missing the following properties from type 'Event[]': length, pop, push, concat, and 26 more
  • this.events = events[0];, this.events 返回上面评论中的错误:Type 'Event' is missing the following properties from type 'Event[]': length, pop, push, concat, and 26 more
  • 你得到这个是因为你的服务中有一个来自 observable 的返回类型Event[],将这个更改为any[]getEventos():Observable&lt;any[]&gt;
  • 返回 HTML 中的错误 Can´t iterate over an object ERROR Error: Cannot find a differ supporting object '[object Object]' of type 'object' 我更改为 *ng-repeat="event in events" 但也返回错误 Can't bind to 'ng-repeat' since it isn't a known property of 'li'.
  • 我还再次检查了您收到的回复,我注意到了我的错误(我认为是这样)。应该是:this.events = events[0].Events;.
【解决方案3】:

您的 JSON 不是一个数组,它是一个对象。

在您的订阅中,我认为您可能想要这样做:

  this.events = events.Events;

正如其他人所提到的,使用您当前的代码,您应该创建两个 ul 列表。如果你想创建一个包含两个项目的列表,你需要这样的东西:

<ul >
    <li class="btn bg-primary text-center" *ngFor="let event of events">
        <h2>Evento:</h2> 
        <p>{{ event.NomeEspec }}</p>
        <p>{{ event.CodEspec }}</p>
        <p>{{ event.DiaHoraEspecs }}</p>
    </li>
</ul>

*ngForul 移动到li

【讨论】:

    【解决方案4】:

    您应该迭代 li 元素,而不是迭代 ul 元素

     <div class="text-center">
            <ul>
                <li class="btn bg-primary text-center" *ngFor="let event of events">
                    <h2>Evento:</h2> 
                    <p>{{ event.NomeEspec }}</p>
                    <p>{{ event.CodEspec }}</p>
                    <p>{{ event.DiaHoraEspecs }}</p>
                </li>
            </ul>
        </div>
    

    【讨论】:

    • 仍然只创建一个 li 元素并且不显示 JSON 信息
    猜你喜欢
    • 2019-06-26
    • 2019-05-09
    • 2019-05-24
    • 2020-06-28
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多