从Angular中的@Input更新ngOnChanges的视图

时间:2019-04-03 12:33:59

标签: javascript angular javascript-objects angular-components ngonchanges

我在类型为Person的子组件中具有@Input属性,并且正在通过属性将父组件中的对象传递给

StackBlitz

中提供了完整的工作代码。

我探索了以下问题,我明白了他们的答案,但我根据答案尝试了Object.assign和其他操作,但未能将数据加载到View中。

如何通过@Input传递对象,一旦对象到达子组件并需要在视图中进行更新,该如何处理?

示例代码:

应用程序组件

import { Component } from '@angular/core';

import { Person } from './models/person'

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  person: Person = {
    firstName: 'Emma',
    lastName: 'Watson'
  };
}

应用程序组件HTML

<user [user-profile]="person"></user>

用户组件

import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
import { Person } from '../models/person';

@Component({
  selector: 'user',
  templateUrl: './user.component.html',
  styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit, OnChanges {

  @Input('user-profile') profile: Person;

  person: Person;

  constructor() {}

  ngOnInit() { 
    this.person = {
      firstName: '',
      lastName: ''
    }
  }

  ngOnChanges(changes:SimpleChanges): void { 
    if(typeof this.profile !== 'undefined' 
      && typeof this.profile.firstName !== 'undefined' 
      && typeof this.profile.lastName !== 'undefined') {
        this.person.firstName = this.profile.firstName;
        this.person.lastName = this.profile.lastName;
    }
  }

}

用户组件HTML

Full Name: {{person.firstName}} {{person.lastName}}

@Input收到对象后,我需要进行一些操作,并需要在UI中对其进行更新。我知道该对象正在作为参考传递,但在这里我尝试使用Object.assign,并用undefined分配了该属性,然后合适的对象没有任何作用。

2 个答案:

答案 0 :(得分:2)

这是因为ngOnInitngOnChanges之后运行。因此,您首先进行设置,然后立即在ngOnInit内部将其重置。

请参见here一个工作示例。

基本上将您的组成人属性更改为此:

person: Person = {
  firstName: '',
  lastName: ''
};

并删除ngOnInit

您也可以在配置文件输入中使用设置器,这样就不需要ngOnChanges

@Input('user-profile') set profile(person: Person) {
  this.person.firstName = profile && profile.firstName || '';
  this.person.lastName = profile && profile.lastName || '';
}

person: Person = {
  firstName: '',
  lastName: ''
};

答案 1 :(得分:2)

person中删除ngOnInit()的赋值,ngOnInit在ngOnChanges之后运行,因此您将值恢复为空

export class UserComponent implements OnInit, OnChanges {

  @Input('user-profile') profile: Person;

  person: Person = { firstName: '', lastName: '' };  // initialize it here

  constructor() {}

  ngOnInit() { 
    // this.person = {
    //   firstName: '',
    //   lastName: ''
    // }
  }

  ngOnChanges(changes:SimpleChanges): void { 



    if(typeof this.profile !== 'undefined' 
      && typeof this.profile.firstName !== 'undefined' 
      && typeof this.profile.lastName !== 'undefined') {
        console.log(this.profile)
        this.person.firstName = this.profile.firstName;
        this.person.lastName = this.profile.lastName;
        console.log(this.person)
    }
  }

}

https://stackblitz.com/edit/angular-input-ng-onchange-qiyghn?file=src%2Fapp%2Fuser%2Fuser.component.ts