Angular - 添加数据后不排序的数组

时间:2017-09-01 10:15:06

标签: javascript angular

我有一个名为JobList的组件,它当前从文件中获取一个JSON对象(稍后将是一个Web服务器),并在页面上显示一个作业列表。我希望列表按每个名为Status.Order的作业中的属性进行排序。

要做到这一点,我正在使用我已设置的管道,如下面的代码所示。

问题:如果我不使用管道,则作业会按文件顺序显示,但如果我使用管道,则根本不会显示任何内容。我在管道代码中做错了吗?

如果我在管道代码中的tranform函数中添加了console.log,那么我可以看到正在传入一个空数组。我希望在添加数据时看到第二次调用,但什么都没有。



export class JoblistComponent implements OnInit {

  private openJobs = new Array();
  private activeJobs = new Array();

  constructor() { }

  ngOnInit() {

    const openJobs = this.openJobs;
    const activeJobs = this.openJobs;

    $.getJSON('assets/data/jobs.json', function (json: Array<any>) {

      for (const job of json) {
        if (job.Status.Section === 'Active') {
          activeJobs.push(job);
        } else {
          openJobs.push(job);
        }
      }
    });
  }
}
&#13;
&#13;
&#13;

要呈现我正在使用此HTML的内容。

&#13;
&#13;
 <div class="job" *ngFor="let job of openJobs | orderByStatus" [ngStyle]="{ 'border-left-color': job.Group.Colour }">
        <span class="title">12 Example Street, {{job.Location.Name}}</span>
        <span>{{ job.Name }}</span>
        <span>{{ job.Type.Name }}</span>
      </div>
&#13;
&#13;
&#13;

&#13;
&#13;
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'orderByStatus'
})
export class OrderByStatusPipe implements PipeTransform {

  transform(array: Array<any>, args?: any): any {

    array.sort((a: any, b: any) => {
      if (a.Status.Order < b.Status.Order) {
        return -1;
      } else if (a.Status.Order > b.Status.Order) {
        return 1;
      } else {
        return 0;
      }
    });

    return array;
  }

}
&#13;
&#13;
&#13;

示例作业

&#13;
&#13;
{
        "_id": "597b5a700c1d413f20c4d67a",
        "Name": "JOB-20170628-029",
        "Created": "2017-07-28T15:38:24.619Z",
        "Group": {
            "_id": "5919e2f96b1822dc0daf94d5",
            "Name": "Priority 3",
            "Colour": "#1bb934",
            "Order": 3,
            "Class": "priority3"
        },
        "Type": {
            "Name": "Type 2",
            "_id": "597b5a680c1d413f20c4b5fc"
        },
        "Status": {
            "Order": 2,
            "Section": "Active"
        }
        "Description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sed lacus sit amet enim congue molestie. \nAenean pharetra tincidunt ligula a luctus. In vel interdum lacus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
        "Location": {
            "Postcode": "RG31 6PL",
            "Name": "RG31 6PL"
        }
    }
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

您尝试在模板中访问异步调用。如果它加载到快速,它根本不加载对象。

在你的HTML中,你试试:

    <span class="title">12 Example Street, {{job.Location.Name}}</span>
    <span>{{ job.Name }}</span>
    <span>{{ job.Type.Name }}</span>

相反,它应该是Angular2中的{{job?.Location?.Name}} {{job?.Name}}{{job.Location.Name | async}} Angular4

休息了

<强>更新

尝试:

如果没有工作,请console.log(a)console.log(b)

if (a.Status.Order < b.Status.Order) {
        return -1;
      } 
if (a.Status.Order > b.Status.Order) {
        return 1;
      } 
        return 0;

答案 1 :(得分:1)

Docs:管道默认 ...

  

只有在检测到输入值的纯变化时,Angular才会执行纯管道。纯更改可以是对原始输入值(StringNumberBooleanSymbol)的更改,也可以是更改的对象引用(Date,{ {1}},ArrayFunction)。

这里我们没有对象引用的更改,只是将值推送到数组。您可以通过将管道标记为不纯来解决此问题:

Object

但我真的建议你在表现方面重新考虑一下,正如文档继续说的那样......

  

Angular在每个组件更改检测周期内执行不纯的管道。经常调用不纯的管道,就像每次按键或鼠标移动一样。

     

考虑到这一点,请小心实施不纯净的管道。昂贵,长时间运行的管道可能会破坏用户体验。

与AngularJS相反,这是Angular中没有@Pipe({ name: 'orderByStatus' pure: false // here }) 管道的主要原因。

我建议你在收到数据后在组件中实现排序和排序:)