2017-10-20 31 views
0

我有一个带有布尔变量的Angular 4组件。初始值取决于输入流。在哪里初始化角4组件中的变量 - ExpressionChangedAfterItHasBeenCheckedError

TypeScript要求我声明变量,如下例所示。没有它,this.isLoading会触发错误。

在这一点上,我不知道它的价值,所以我只声明它没有分配一个变量。

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    isLoading: boolean; 

    ngOnInit() { 
    someStream.subscribe((someData) => { 
     // Code to determine the value for isLoading 
     this.isLoading = true; 
    }); 
    } 
} 

后来当我知道值时,我会将它设置为true或false。但后来'ExpressionChangedAfterItHasBeenCheckedError'开始。

什么是设置这些'默认'值的'正确方法'。

+0

尝试ngOnChages()生命周期而不是ngOnInit(),它可能会解决您的问题。 –

+0

何时何地在someStream上调用next? –

+0

@MohamedGara在同一个onInit块中是一些检查URL参数的逻辑。如果所有需要的参数都在那里,它会启动一个http调用并设置isLoading。 –

回答

0

我认为isLoading是你的标志,知道请求是否完成。 我在这种情况下所做的是初始化加载假:直接

export class SomeComponent implements OnInit { 
    @Input() someStream$; 
    // Initialized as false. 
    isLoading: boolean = false; 

    ... 
} 

如果isLoading标志有更多的逻辑,我会改变你的组件进行交互的方式,改变@input()来someData,和处理父级中的异步逻辑。

希望它有帮助。

+0

我试过这个,当isLoading在ngOnInit的'同一个嘀嗒'中的计算结果为true时,它不工作我得到ExpressionChangedAfterItHasBeenCheckedError。我担心将变量移到父级只会将问题移到另一个组件。 –

+0

有点奇怪,因为我拥有完全相同的代码,并且不会引发任何错误。可以肯定的是,您的订阅是否仅触发一次?也许观察者在同一周期内发送新值。 –