【问题标题】:How to call a function just before the *ngFor loop? ::Angular2如何在 *ngFor 循环之前调用函数? ::角2
【发布时间】:2017-04-29 17:54:25
【问题描述】:

首先,我有一个http请求,看起来像:

private getValues() {
  this._watchlistElements.map(v =>
    this.http.get('http://localhost:8080/getValue/' + v.xid)
    .subscribe(res => {
      this._values.push(res.json());
    }));
};

一切正常,但问题是它返回了一个混乱的、未排序的对象数组。我要排序,所以我做了一个单独的排序函数:

private sortPoints(){
  this._values.sort((a,b) => a.ts - b.ts);
}

_values 变量中的元素由*ngFor 循环显示:

<tr *ngFor="let elem of _values">

getValues() 函数每隔 5 秒被调用一次:

this.loadPoints = setInterval(() => {
  this.getValues();
}, 5000);

现在我必须在某处调用排序函数 - sortPoints()。我认为这种方式会很好:

this.loadPoints = setInterval(() => {
  this.getValues();
  this.sortPoints();
}, 5000);

但不幸的是它不会影响数组。 *ngFor 循环只是用未排序的元素填充表格。但如果我只是做一个简单的按钮:

&lt;button (click)="sortPoints()"&gt;Sort it!&lt;/button&gt;

数组正在动态排序,就在按钮单击之后。

那么我的问题是您是否还有其他想法将函数放置在何处以使该机制起作用?

非常感谢任何帮助。

EDIT 实施了@Sasxa 解决方案,收到以下错误:

【问题讨论】:

  • 因为 this.getValues();是异步调用 this.sortPoints();在你分配值之后,即 this._values.push(res.json());
  • 如果您这样做只是为了展示,请查看 OrderBy
  • @George OrderBy 是一个管道。我试图用管道解决它,但它不能正常工作。

标签: javascript arrays sorting angular typescript


【解决方案1】:

您可以链接可观察的运算符并处理流,因此最后(当您订阅时)您可以根据需要获得值:

private getValues() {
  this._watchlistElements.map(v =>
    this.http.get('http://localhost:8080/getValue/' + v.xid)
      .map(res => res.json())
      .map(data => this._values.push(data))
      .map(() => this._values.sort((a,b) => a.ts - b.ts))
      .subscribe(sorted => this._values = sorted));
};

【讨论】:

  • 不知何故它不起作用。出现错误:values.sort 不是函数。 Webstorm 还为.map(res =&gt; res.json()) 行中的map 着色,并警告它是一个未解决的函数或方法。
  • 您从 http 获取的数据不是数组。如果要将数据存储在数组中并进行排序,最好创建一个管道。
  • 不是数组吗?如果我console.log_values 变量,它说它是一个对象数组...它也有一个数组原型...
  • _values 是数组,但 response.json() 不是,在我的示例中, sort() 运行在响应数据上,而不是 _values ......我更新了答案,这可能有效。如果没有,请移动一些东西,类似的东西会起作用......
  • 你的回答让我大吃一惊。我什至没有想到响应可能不是数组。有没有其他方法可以在不使用管道的情况下解决它?我已经尝试过通过管道进行操作,但没有成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多