2017-05-05 4 views
2

J'ai créé un tuyau pour pouvoir utiliser *ngFor with objects. Toutefois, lorsque l'objet est mis à jour, le canal n'est pas mis à jour. J'ai trouvé une solution here en utilisant le tube stateful avec pure: false.Mise à jour manuelle du tuyau de déclenchement

Cette solution n'est pas acceptable en termes de performance pour mon cas d'utilisation car elle rafraîchira le tuyau pour chaque changement (j'utilise ce tuyau presque partout pour rendre des éléments complexes).

Existe-t-il un moyen de déclencher un rafraîchissement manuel du tuyau afin qu'il ne rafraîchisse que lorsque je le souhaite?

Voici un plunker - pour voir le problème, essayez de supprimer un nom en cliquant sur un bouton -. Si vous ajoutez pure:false vous verrez que cela fonctionnera:

@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; 
    } 
} 

Ce que je voudrais est d'ajouter quelque chose à ma fonction delName() il met à jour le tuyau ...

+0

Avez-vous besoin d'utiliser 'Pipe' et êtes-vous capable de changer la structure de données de 'names'? – ulubeyn

+0

Avoir à utiliser 'Pipe', non, mais je ne pouvais pas trouver une meilleure solution pour utiliser l'objet dans' * ngFor'. Je ne peux pas changer ma structure de données ... – ncohen

Répondre

2

Une façon de faire un pur Pipe devenant impure est d'ajouter un parameter à votre Pipe. Lorsque vous souhaitez actualiser, il vous suffit de modifier le paramètre

demo plunker.


Une autre façon sans paramètre:

Pure Pipe sera tiré lorsque son entrée a une nouvelle instance. Ainsi, avec TypeScript 2.1+, le code ci-dessous va copier l'objet original avec une nouvelle instance, et conduire le tube pur à déclencher.

let copy = { ...original } 

demo plunker2.

+0

Pourriez-vous expliquer ce qui se passe ici? – ncohen

+0

@ncohen Ici, nous profitons du fait que le tuyau Pure sera déclenché lorsque son paramètre change. – Pengyy

+0

Ca marche mais c'est pas très propre ... ça n'a pas de sens de créer et de passer une variable qui ne sera jamais utilisée. Y a-t-il un moyen plus propre d'y parvenir? – ncohen