Angular2 在收到数据后应用 Pipe

Angular2 applying Pipe after data is received

我有一个Object用于管理从后端接收的数据。 它以 display: false 的所有字段启动,如果我从服务器收到该特定字段,我最终会将其更改为 true

filterGroups(初始):

export let filterGroups: any = {
    genericFilters: {
        iboId: {
            'display': false,
            'template': ''
        },
        iboCode: {
            'display': false,
            'template': 'text/iboCode'
        },
        iboName: {
            'display': false,
            'template': 'text_input_iboName'
        },
        iboSurname: {
            'display': false,
            'template': 'text_input_iboSurname'
        },
        iboRank: {
            'display': false,
            'template': 'select/multi_iboRank',
        },
        iboEmail: {
            'display': false,
            'template': 'text_input_iboEmail'
        },
        iboNewsletter: {
            'display': false,
            'template': 'select/simple_iboNewsletter',
        },
    },
    orderFilters: {
        iboTotalOrders: {
            'display': false,
            'template': 'compound/iboTotalOrders',
        }
    },
    peFilters: {
        iboTotalPE: {
            'display': false,
            'template': 'checkbox/iboTotalPE',
        }
    },
};

在我的模板中,我想要 div 个过滤器组。在这种情况下,我们有 3 个过滤器组:genericFiltersorderFilterspeFilters.

一旦我从服务器(我在 constructor 中调用)收到数据,就会修改此 Object

因此,在我从 异步调用 .

收到数据后,我的 filterGroups 将如下所示

filterGroups(异步调用后):

export let filterGroups: any = {
    genericFilters: {
        iboId: {
            'display': true,
            'template': ''
        },
        iboCode: {
            'display': true,
            'template': 'text/iboCode'
        },
        iboName: {
            'display': true,
            'template': 'text_input_iboName'
        },
        iboSurname: {
            'display': true,
            'template': 'text_input_iboSurname'
        },
        iboRank: {
            'display': false,
            'template': 'select/multi_iboRank',
        },
        iboEmail: {
            'display': true,
            'template': 'text_input_iboEmail'
        },
        iboNewsletter: {
            'display': false,
            'template': 'select/simple_iboNewsletter',
        },
    },
    orderFilters: {
        iboTotalOrders: {
            'display': true,
            'template': 'compound/iboTotalOrders',
        }
    },
    peFilters: {
        iboTotalPE: {
            'display': false,
            'template': 'checkbox/iboTotalPE',
        }
    },
};

现在,在我的模板中我有这个:

模板 (HTML):

<div *ngFor="let group of filterGroups | keysCheckDisplay">
    <div>
        <h4>{{group.key}}</h4>
    </div>
</div>

而且,很明显,这是我的 @Pipe

@管子:

import { PipeTransform, Pipe } from '@angular/core';
import { isNullOrUndefined } from 'util';

@Pipe({name: 'keysCheckDisplay'})
export class KeysCheckDisplayPipe implements PipeTransform {
    transform(value, args: string[]): any {
        let keys = [];
        for (let key in value) {
            if (!isNullOrUndefined(value[key])) {
                let display = false;
                for (let keyChild in value[key]) {
                    if (!isNullOrUndefined(value[key][keyChild]) && value[key][keyChild]['display'] === true) {
                        display = true;
                        break;
                    }
                }
                if (display === true) {
                    keys.push({key: key, value: value[key]});
                }
            }
        }
        return keys;
    }
}

在这个 @Pipe 中,如您所见,我做了几件事:

功能:

我希望这个 @Pipe 循环遍历我的 Objectreturn 我 'filter groups' 至少有 1 个元素 display: true.

问题:

@Pipe 正在获取 filterGroups object 的第一个版本,并且忽略了 object 在我收到来自服务器。

如果我修改 filterGroups object.

的初始值,@Pipe 工作正常

我试过的:

Error: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'

可能的解决方案?

我希望它是详细和清晰的,如果不是,请不要急于发表评论要求更多细节,我很乐意更新 post。

先谢谢你!

纯管道仅在数据更改时调用。这意味着 "data" 是一个新的对象实例。如果仅修改了对象的内容,则 Angular 更改检测不会将其识别为更改,也不会调用管道。

可能的方法

  • 使管道不纯:通常对性能造成相当大的负担
  • 像这样复制对象:
var tmp = this.data; this.data = {}; Object.assign(this.data, tmp);
  • 向管道添加附加参数并更新参数值
*ngFor="let item of data | myPipe:counter"
// updated `data`
// this.counter++;