Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何停止在ngOnInit()之前调用的ngOnChanges_Angular - Fatal编程技术网

Angular 如何停止在ngOnInit()之前调用的ngOnChanges

Angular 如何停止在ngOnInit()之前调用的ngOnChanges,angular,Angular,在我的angular应用程序中,我提出了一种情况,即只有当输入绑定到更改时才应该调用ngOnchanges。那么,有没有办法在ngOnInit之前停止ngOnChanges的执行。有没有办法做到这一点。 提前感谢。您无法阻止这种行为,但您可以: 使用主题: 类Foo实现OnChanges、OnInit和OnDestroy{ onChanges=新主题(); 恩戈尼尼特(){ this.onChanges.subscribe((数据:SimpleChanges)=>{ //只有在初始化时 });

在我的angular应用程序中,我提出了一种情况,即只有当输入绑定到更改时才应该调用ngOnchanges。那么,有没有办法在ngOnInit之前停止ngOnChanges的执行。有没有办法做到这一点。
提前感谢。

您无法阻止这种行为,但您可以:

使用主题:
类Foo实现OnChanges、OnInit和OnDestroy{
onChanges=新主题();
恩戈尼尼特(){
this.onChanges.subscribe((数据:SimpleChanges)=>{
//只有在初始化时
});
}
恩贡德斯特罗(){
this.onChanges.complete();
}
ngOnChanges(更改:SimpleChanges){
this.onChanges.next(变更);
}
}
使用布尔属性:
类Foo实现OnChanges,OnInit{
初始化=假;
恩戈尼尼特(){
//做事
this.initialized=true;
}
ngOnChanges(更改:SimpleChanges){
if(this.initialized){
//当ngOnInit被调用时,做一些事情
}
}
}
使用
SimpleChanges
API 您还可以检查以下方法:

isFirstChange():布尔值
检查新值是否为分配的第一个值

类Foo实现OnChanges,OnInit{
@输入()
酒吧:任何;
恩戈尼尼特(){
//做事
}
ngOnChanges(更改:SimpleChanges){
如果(!changes[“bar”].isFirstChange()){
//如果这不是“bar”的初始化,请执行操作
}
}
}

我发现一种有效的方法是基于这样一个事实,即输入值都具有previous value属性。如果之前未设置输入,则该值将为
CD_INIT_值
(作为字符串)。因此,您可以设置一个条件,即只有在上一个值不是
CD\u INIT\u value
时,才应运行
ngOnChanges
中的代码块。下面是一个测试所有输入值的示例:

ngOnChanges(changes: SimpleChanges) {
  let initialized: boolean = true;
  for (let prop in changes) {
    if (changes[prop].previousValue.toString() === 'CD_INIT_VALUE') {
      initialized = false;
      //we can break here since if any item is not initialized
      //we will say the inputs are NOT initialized
      break;
    }
  }

  if (initialized) {
    //code you want to execute
  }    
}
可能有更优雅的解决方案,但我发现这是可行的。
这可能太晚了,无法帮助你,但可能会帮助其他人,因为当我在谷歌上搜索时,我发现了这个问题。这个解决方案是我从调试中找到的。

如果它对任何人都有帮助,下面是我如何将@n00dl3建议的
isFirstChange()
解决方案实现到AngularJS应用程序中的示例:

this.$onChanges = (changes) => {
    if (!changes.value.isFirstChange()) {
        // do stuff
    }
};

这是正常的行为。看一看Angular 2文档中的。例如,您可以尝试
ngAfterViewInit()
而不是
ngOnChange
(在Angular初始化组件的视图和子视图后响应)是的,我知道。在ngoninit执行后,有没有办法监听我输入中的更改?就在ngoninit()执行之后,
ngoninit()
ngDoCheck()
(但会执行多次)。如果您使用的是被动表单,则可以保持ngOnChange并检查表单字段是否已设置(
If(this.form.get('yourField').value).
)。类似于你现在拥有的东西。是的,我尝试过ngdocheck,但它进入了一种无限循环。这不是一个表单,dataready是我从另一个组件获得的输入,我想听听它的变化。但是,如果您提供有关您试图解决的实际问题的信息,我们可能会提供其他有助于解决您的问题的方法。我是否可以使用自己的数据类型模型来代替
SimpleChanges
?对不起,我不理解您的问题。我的意思是:我有自己的模型公共数据:own;并将模型与模板绑定。我如何才能听到此模型的任何更改?此答案假设您可以跳过第一个ngOnChanges。这并不能解决问题。问题是在第一次ngOnChanges之前如何称呼ngOnInit。我认为这是一个设计缺陷,尤其是在使用可选参数时。@cyberfly,这取决于您的需要,本质上并不是更好。请注意,使用ReplaySubject,您将获得初始化之前设置的数据,这不是我们在这里想要的。还请注意,您可以对常规可观察对象/主题执行
publishReplay()
connect()
shareReplay()
,以获得相同的行为。