手动触发管道更新
Manually trigger pipe update
我创建了一个可以使用 . However, when the object is updated, the pipe does not update. I have found a solution 的管道,方法是将有状态管道与 pure: false
结合使用。
就我的用例的性能而言,此解决方案是不可接受的,因为它会为每次更改刷新管道(我几乎在任何地方都使用此管道来呈现复杂元素)。
有没有办法触发管道的手动刷新,以便它只在我需要时刷新?
这里是 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()
函数中添加一些东西,以便更新管道...
第一种方式:参数
使纯管道变得不纯的一种方法是在您的Pipe
中添加parameter
。
想刷新的时候改参数就行了
第二种方式:不带参数
Pure Pipe 将在输入有新实例时触发。因此,对于 TypeScript 2.1+,以下代码将使用新实例复制原始对象,并导致纯管道被触发。
let copy = { ...original }
负面影响
这将强制您的组件在每次变量更改其值时刷新您的管道,即使这不是管道包含的那个
Stackblitz
两种方式都包含在stackbliz demo.
带有输入对象的纯管道只会在对象的引用发生变化时发出更新。
如果您能找到一种方法在对象的部分结构发生变化时用新实例替换,纯管道将根据需要自动更新其输出。
假设您现有的 delName
函数只是从现有结构中删除一个元素:
this.elements.remove(0);
您可以通过将 this.elements
替换为新版本来更新它:
this.elements = this.elements.splice(1);
创建一个管道,这里有两种解决方法:
1,但是这种方式会被多次触发,对网站不好。
@Pipe({
name: 'tablepipe',
pure: false
})
2.Using ngModel + 纯管道
<input
style="position: absolute;
z-index: -1;"
[(ngModel)]="detectedChangeRef">
this.detectedChangeRef = Math.random();
你的 html,因为管道会注意到你的引用的变化,它会触发你的管道:
*ngFor="let item1 of item | tablepipe:detectedChangeRef;">
你的烟斗
transform(value,detectedChangeRef) {
console.log(detectedChangeRef);
// do sth..
}
我创建了一个可以使用 pure: false
结合使用。
就我的用例的性能而言,此解决方案是不可接受的,因为它会为每次更改刷新管道(我几乎在任何地方都使用此管道来呈现复杂元素)。
有没有办法触发管道的手动刷新,以便它只在我需要时刷新?
这里是 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()
函数中添加一些东西,以便更新管道...
第一种方式:参数
使纯管道变得不纯的一种方法是在您的Pipe
中添加parameter
。
想刷新的时候改参数就行了
第二种方式:不带参数
Pure Pipe 将在输入有新实例时触发。因此,对于 TypeScript 2.1+,以下代码将使用新实例复制原始对象,并导致纯管道被触发。
let copy = { ...original }
负面影响
这将强制您的组件在每次变量更改其值时刷新您的管道,即使这不是管道包含的那个
Stackblitz
两种方式都包含在stackbliz demo.
带有输入对象的纯管道只会在对象的引用发生变化时发出更新。
如果您能找到一种方法在对象的部分结构发生变化时用新实例替换,纯管道将根据需要自动更新其输出。
假设您现有的 delName
函数只是从现有结构中删除一个元素:
this.elements.remove(0);
您可以通过将 this.elements
替换为新版本来更新它:
this.elements = this.elements.splice(1);
创建一个管道,这里有两种解决方法:
1,但是这种方式会被多次触发,对网站不好。
@Pipe({
name: 'tablepipe',
pure: false
})
2.Using ngModel + 纯管道
<input
style="position: absolute;
z-index: -1;"
[(ngModel)]="detectedChangeRef">
this.detectedChangeRef = Math.random();
你的 html,因为管道会注意到你的引用的变化,它会触发你的管道:
*ngFor="let item1 of item | tablepipe:detectedChangeRef;">
你的烟斗
transform(value,detectedChangeRef) {
console.log(detectedChangeRef);
// do sth..
}