是否所有setInterval函数都会触发更改检测?

时间:2017-05-30 16:09:28

标签: angular

根据标题,我很好奇每次用setInterval创建一个区间时,如果由于Angular完成填充,如果每次间隔运行时都会创建一个更改检测事件。

我一直在阅读我能找到的所有文档,但我找不到明确的答案。

为了澄清,我的问题是,如果我运行以下代码,那么间隔的每次迭代都会触发更改检测事件并导致Angular尝试更新应用程序的视图,直到满足条件为止?

let myInterval = setInterval( () => {

    if (conditionsAreMet()){
        clearInterval(myInterval);
    }
})

1 个答案:

答案 0 :(得分:3)

这取决于使用export class AppComponent { name = 'Angular'; constructor(zone: NgZone) { // will not trigger change detection zone.runOutsideAngular(() => { setInterval(() => { this.name = 'boob'; }, 2000); }) 的区域。如果它在NgZone中使用,那么是的,它每次都会触发变化检测。如果在角度区域外运行它,它将不会触发变化检测。

外角区:

export class AppComponent {
  name = 'Angular';

  constructor(zone: NgZone) {
    // will not trigger change detection
    setInterval(() => {
      this.name = 'boob';
    }, 2000);
  }

在Angular区域内:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                // all requests must be authenticated
                .anyRequest().authenticated()
                // allow access to static resources
                .antMatchers("/css/**", "/images/**", "/js/**", "/webjars/**").permitAll()
                .and()
            // login form authentication entry point
            .formLogin()
                .permitAll()
                .loginPage("/login")
                .usernameParameter("userId")
                .and()
            // allow unrestricted access to the logout action
            .logout()
                .logoutUrl("/logout")
                .permitAll();
    }