@Input属性在Angular 2的onInit中未定义


73

尝试@Inputconstructor或中获取组件的值ngOnInit。但是它一直undefined都在来。

我用 console.log用来以显示此问题(β角)。 http://plnkr.co/edit/dseNM7OTFi1VNG2Z4Oj5?p=preview

export class HeroDetailComponent implements OnInit {
  constructor(){
    console.log('hero', this.hero)
  }
  public hero: Hero;
  
  ngOnInit() {
    console.log('hero', this.hero)
  }
}

我在这里做错了什么?


嗯,我没有意识到在这个例子中我们并没有选择英雄……我很高兴它也没有在unk弹枪中起作用:)我在pl弹枪中检查了一下,它工作正常。但是,在我的代码中,它无法正常工作,但已初始化...对不起,错误的插件。我会接受答案,但不能解决我的问题。
eesdil 2015年

1
因此,问题在于我将camelCase属性“ inputProperty”放在@Input ...而不是“ input-property” ...奇怪的是没有意识到..但是在API文档中是这样写的。
eesdil 2015年

Answers:


113

之所以未定义,ngOnInit是因为在初始化组件时,实际上还没有传递Hero对象

<my-hero-detail [hero]="selectedHero"></my-hero-detail>

此时selectedHero,您中没有任何值,AppComponent并且直到列表上的click事件调用该onSelect方法时才如此

编辑:抱歉,我实际上没有提供修复程序。如果添加ngIfmy-hero-detail

<my-hero-detail *ngIf="selectedHero" [hero]="selectedHero"></my-hero-detail>

您应该这样做会延迟my-hero-detail组件的初始化,并且应该看到控制台输出。这不会然而,再次输出所选择的英雄变化时。


3
解决我的问题,好吧。开箱即用,您可能会发现一些新东西
materliu16年

1
太棒了 那就是我所需要的。
迈克尔·亨德森

优秀的解决方案。非常感谢,伙计!:)
对象操纵器

45

这是因为英雄是异步加载的,因此在最初渲染视图时,未定义所选英雄。但是随后进行选择后,英雄将以定义的值传递到详细信息视图中。

基本上,您只是看到基于原始值(未定义)的onInit调用。

如果您希望在每次选择后执行类似的操作,则可以这样修改它:

export class HeroDetailComponent implements AfterViewChecked {
  constructor(){
    console.log('hero', this.hero)
  }
  public hero: Hero;

  ngAfterViewChecked() {
    console.log('hero', this.hero)
  }
}

是的,应该。
Amr ElAdawy'17年

使用angular5。错误:ExpressionChangedAfterItHasBeenCheckedError:检查表达式后,表达式已更改。上一个值:“未定义”。当前值:“ [object Object]”。
Faiz Mohamed Haneef

如果您更改该函数中的值,则会发生@FaizMohamedHaneef。由于angular已经检查了所有变量的更改,因此如果您随后在调试模式下更改了值(如果不是在生产环境中,因为angular不会像在调试中那样再次进行检查),则会向您发出警告。如果您确实需要更改值,并且确定处理正确,请将其包装在超时中。
Agash Thamo。

21

当我在中未定义Input属性值时,我遇到了相同的行为ngOnInit*ngIf="selectedHero"html代码中的语句使我不满意。此外,使用AfterViewChecked@ THG的回答是不是对我来说是很好的解决方案,因为它定期调用并且还导致警告ExpressionChangedAfterItHasBeenCheckedError的时候我想改变一些变量(我不想用的解决方法setTimeout)。这是我针对此类问题的解决方案:

export class MyComponent implements OnChanges {
    @Input() myVariable: any;

    ngOnChanges(changes: SimpleChanges) {
        if (changes['myVariable']) {
            let variableChange = changes['myVariable'];
            //do something with variableChange.currentValue
        }
    }
}

希望以后对您有所帮助。


在我的情况下,if语句和方括号中的变量不起作用,相反,我只是检查了另一个条件。但是有效!!谢谢
l3o

它工作正常。我不知道他为什么不批准这一点。
Rupesh


0

@Barabas解决方案在我的情况下不起作用。我最终用这个

export class HeroDetailComponent implements OnChanges {
    @Input() hero: any;

    ngOnChanges(changes: SimpleChanges){
        if(changes.hero && changes.hero.currentValue){
            let currentHero = changes.hero.currentValue;
            //use currentHero
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.