2017-03-02 51 views
0

我有一个使用Material Design Lite的angular2组件,但复选框(也可能是其他人)在第一次加载组件时没有正确呈现,而如果我与复选框交互,mdl样式已正确应用。在我的组件我有在生产代码中使用setTimeout是否安全?

ngAfterViewInit() { 
    componentHandler.upgradeDom(); 
} 

,但不能解决我的问题,所以我用的setTimeout要执行的服务已经恢复了一些数据之后。这似乎工作,但它是否建议这样做?

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

它在那里,所以它可以使用。它就在你想要使用的地方以及如何! – Smit

+0

也许你可以试试'changeDetection:ChangeDetectionStrategy.OnPush'.你可以在[Change Detection Explained]中找到一些有用的信息(https://blog.thoughtram.io/angular/2016/02/22/angular-2-change - 检测 - explained.html) –

回答

0

不知道你的代码的来龙去脉,单纯从理论层面的引入竞争条件在哪里(这是什么都被延误了)必须在10ms内完成。

你能否确认它会一直这样做?如果你能(100%肯定)我会说没关系。但是,从经验来看,我会说远离超时,而是尽可能使用事件。

请注意:我还没有使用Angular 2,但我知道在Angular 1中,摘要有时需要手动触发。这可能是这里发生的事情。

1

如果您也将组件设置添加到问题中,这将有所帮助。查看angular.io文档的组件样式部分。我想你所需要的只是将选择器和样式添加到组件的注释中。从文档:

@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 { 
    /* . . . */ 
} 
相关问题