2017-03-02 1 views
0

J'ai un composant angular2 en utilisant Material Design Lite mais les éléments checkbox (probablement aussi) ne sont pas rendus correctement au premier chargement du composant, alors que si j'interagis avec les cases à cocher, le style mdl est correctement appliqué. Dans mon composant jeEst-il prudent d'utiliser setTimeout dans le code de production?

ngAfterViewInit() { 
    componentHandler.upgradeDom(); 
} 

mais cela ne résout pas mon problème, donc je un setTimeout être exécuté juste après le service a renvoyé des données. Cela semble fonctionner mais est-il recommandé de le faire comme ça?

this.service.getDetails(this.id) 
      .finally(() => { 
       setTimeout(() => { 
        componentHandler.upgradeDom(); 
       }, 10); 
      }) 
      .subscribe((details) => { 
       this.details = details; 
      }); 
+0

Il est là, il peut donc être utilisé. C'est juste où vous voulez utiliser et comment! – Smit

+0

Peut être vous pouvez essayer 'changeDetection: ChangeDetectionStrategy.OnPush'.Vous pouvez trouver quelques informations utiles dans [Change Detection Explained] (https://blog.thoughtram.io/angular/2016/02/22/angular-2-change -detection-explain.html) –

Répondre

0

Sans connaître les tenants et les aboutissants de votre code, uniquement à partir d'un niveau théorique votre introduction d'une condition de course où (ce que jamais il est qui cause le retard) doit se terminer dans les 10 ms.

Pouvez-vous confirmer qu'il le fera toujours? Si vous le pouvez (avec une certitude de 100%), je dirais que c'est bien. Cependant, par expérience, je dirais que je m'éloigne des délais et que j'utilise des événements si possible. Juste une note: Je n'ai pas encore utilisé Angular 2 mais je sais que dans Angular 1, le résumé doit parfois être déclenché manuellement. C'est peut-être ce qui se passe ici.

1

Il serait utile que vous ajoutiez également la configuration de votre composant à la question. Jetez un oeil à la section Styles de composants des docs angular.io. Je suppose que tout ce dont vous avez besoin est d'ajouter le sélecteur et le style à l'annotation de votre composant. De la docs:

@Component({ 
    selector: 'hero-app', 
    template: ` 
     <h1>Tour of Heroes</h1> 
     <hero-app-main [hero]=hero></hero-app-main>`, 
    styles: ['h1 { font-weight: normal; }'] 
}) 
export class HeroAppComponent { 
    /* . . . */ 
}