在Angular 2中实现异步排序管道

前端之家收集整理的这篇文章主要介绍了在Angular 2中实现异步排序管道前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在Angular 2中创建一个自定义管道,它将对一组对象进行排序.我从 this post获得了一些帮助.然而,我似乎无法让这个工作.

我的烟斗看起来像这样:

@Pipe({
  name: "orderByAsync",pure: false
})
export class AsyncArrayOrderByPipe  {
  private _promise : Promise<Array<Object>>;
  private _output: Array<Object>;

  transform(promise: Promise<Array<Object>>,args: any): Array<Object>{
    var _property : string = "";
    var _descending : boolean = false;

    this._property = args[0]["property"] || "";
    this._descending = args[0]["descending"] || false;

    if(!this._promise) {
      this._promise = promise.then((result) => {
        result.sort((a: any,b: any) => {
          if (a[this._property] < b[this._property])  return (this._descending ? 1: -1);
          else if (a[this._property] > b[this._property]) return (this._descending ? -1: 1);
          else return 0;
        });

        this._output = result;
      });
    }

    return this._output;
  }
}

管道的使用如下所示:

<div *ngFor="#c of countries | orderByAsync">{{c.name}}</div>

就像视图永远不会被通知承诺已经解决并且数据已被返回.

我错过了什么?

当promise解析时,内置的异步管道注入一个ChangeDetectorRef并在其上调用markForCheck().要在一个管道中完成所有操作,您应该遵循该示例.您可以查看该 here的Typescript源.

但是,我建议忘记自己处理异步,而是写一个纯无状态排序管道并用内置的异步管道链接它.为此,你可以编写你的管道来处理一个裸数组,而不是一个promise,并像这样使用它:

<div *ngFor="#c of countries | async | orderBy">{{c.name}}</div>

猜你在找的Angularjs相关文章