Angular 角度2:在不丢失数据绑定的情况下在管道中连接阵列

Angular 角度2:在不丢失数据绑定的情况下在管道中连接阵列,angular,data-binding,pipe,concat,Angular,Data Binding,Pipe,Concat,我有一个简单的管道: export class MergePipe implements PipeTransform { transform(first: any[], second: any[], order: Boolean): any { return order ? first.concat(second):second.concat(first); } 我在一个简单的按钮上使用: 然后用newItems.push(值)将一些值推送到newItems中,但什么也没有发生。如果我

我有一个简单的管道:

export class MergePipe implements PipeTransform {
transform(first: any[], second: any[], order: Boolean): any {
    return order ? first.concat(second):second.concat(first);
}
我在一个简单的按钮上使用:

然后用newItems.push(值)将一些值推送到newItems中,但什么也没有发生。如果我从*ngFor中删除管道,我将收到预期的更改

我想我误解了数据绑定是如何工作的


感谢您提供的有用信息。

如果您修改其中一个数组,Angulars change detection将看不到更改,因此不会调用管道。
角度变化检测仅检查对象标识,而不检查对象内容

可以使管道不纯净,也可以在每次修改Angular后创建管道副本以查看新阵列

@Pipe({name:'…',pure:false})
这可能会导致严重的性能问题,因为现在每次运行更改检测时都会调用管道

someMethod(){
this.newItems.push(someNewItem);
this.newItems=this.newItems.slice();
}
修改后创建副本会导致角度变化检测识别变化并调用管道

另一种方法是使用虚拟参数

计数器:int=0;
someMethod(){
this.newItems.push(someNewItem);
这个.counter++;
}


通过这种方式,更改检测将检测参数的更改并调用管道。

如果阵列引用没有更改,Angular似乎不知道如何重新计算该管道

如果我们看看他们对管道的讨论:

将英雄添加到英雄阵列中。对数组的引用未更改。它是同一个数组。这就是我所关心的。从它的角度来看,相同的数组,没有更改,没有显示更新。

您应该将此代码改为:

newItems=newItems.concat(值)


这将更新引用并导致重新评估管道。

纯管道仅在更改
指针时更新,例如,您的
第一个
更改为另一个数组,而不是自身可变。您可以通过设置
@Pipp({pure:false})
来更改为不纯管道。您可以搜索管道文档。谢谢您的回答。对于不纯净的管道,它可以正常工作,但我现在还不知道它是如何工作的。非常感谢,完美的答案,特别是第二种解决方案是一个很好的解决办法。