2017-05-05 82 views
2

我已经创建了一个管道,可以使用*ngFor with objects。但是,更新对象时,管道不会更新。我通过使用有状态管道pure: false找到了解决方案here手动触发管道更新

这个解决方案在性能方面是不可接受的,因为它会刷新每次更改的管道(我几乎在任何地方都使用这个管道来渲染复杂的元素)。

有没有办法触发管道的手动刷新,以便只在需要时刷新?

这是一个plunker - 要查看该问题,请尝试通过单击-按钮来删除名称。如果添加pure:false你会看到,它会工作:

@Pipe({name: 'keys', pure: false}) 
export class Keys implements PipeTransform { 
    transform(value, args:string[]) : any { 
    let keys = []; 
    for (let key in value) { 
     keys.push({key: key, value: value[key]}); 
    } 
    return keys; 
    } 
} 

我想什么是什么添加到我的delName()功能,所以它更新管......

+0

你是否需要使用'Pipe'并且能够改变'names'的数据结构? – ulubeyn

+0

必须使用'Pipe',否,但是我找不到在'* ngFor'中使用对象的更好的解决方案。我无法改变我的数据结构... – ncohen

回答

2

一种方法,使纯管变成不纯是将parameter添加到您的Pipe

当你想刷新时,只需更改参数。

demo plunker


另一种方法不带参数:当输入了一个新的实例

纯管道将被解雇。因此,对于TypeScript 2.1+,下面的代码将复制原始对象与一个新的实例,并导致纯管被解雇。

let copy = { ...original } 

demo plunker2

+0

你能解释一下这里发生了什么吗? – ncohen

+0

@ncohen在这里,我们正在利用它的参数改变时,Pure管道将被触发。 – Pengyy

+0

它可以工作,但它不是很干净......创建并传递永远不会使用的变量没有意义。有没有更好的方法来实现这一目标? – ncohen