如何在 EmberJS 应用程序中显示分组结果

How do I display grouped results in an EmberJS Application

我创建了一个简单的 EmberJS 应用程序,它列出了来自无头 CMS 的作业。来自后端的职位数据是这种格式

[
   {
      "id": "1234",
      "description": "Test description"
      "category": "Human Resources"
   },
   {
      "id": "4321",
      "description": "Test description"
      "category": "Human Resources"
   },
   {
      "id": "5678",
      "description": "Test description"
      "category": "Information Technology"
   }
]

我的应用程序按预期返回的顺序显示结果,但我想按类别对结果进行分组,以便结果显示如下:

人力资源

信息技术

在此先感谢您的帮助。

注意:我使用的是 EmberJS 3.19 版

编辑

我现在的模型就是工作模型

import Model, { attr } from "@ember-data/model";

export default class JobModel extends Model {
  @attr Title;
  @attr Description;
  @attr Type;
  @attr Slug;
  @attr category;
  @attr job_type;
  @attr region;
  @attr company;
  @attr createdAt;
}

我在我的索引路由(主页)中使用 ember-data 加载数据,就像这样

export default class IndexRoute extends Route {
  @service store;
  async model() {
    return this.store.findAll("job");
  }
}

通过该设置,我可以遍历作业并将它们显示在我主页上的列表中,如下所示:

{{#each @model as |job|}}
        <Job @job={{job}} />
{{/each}}

不确定是否可行,但我希望能够显示每个类别以及该类别中包含的职位,其结构类似于以下伪代码:

{{#each category}}
<h3>{{category.name}}</h3>
  {{#each job-in-category}}
        <Job @job={{job}} />
  {{/each}}
{{/each}}

基本上您可以将逻辑添加到您的路由 model 挂钩或创建一个控制器并使用 getter.

在你可以做的路线中

  async model() {
    const jobs = await this.store.findAll("job");
    return jobs.reduce((groups, job) => {
      if(!groups.has(job.category)) {
        groups.set(job.category, []);
      }
      groups.get(job.category).push(job);
      return groups;
    }, new Map());
  }

并在您的模板中使用它:

{{#each-in @model as |category jobs|}}
  <h3>{{category}}</h3>
  {{#each jobs as |job|}}
    <Job @job={{job}} />
  {{/each}}
{{/each-in}}

您可以在控制器上的 getter 中生成相同的结构或为其使用专用组件。也可能您想为您的类别创建专用 ember-data 模型并使用关系。