2

我在 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然后适当的对象没有任何工作。

4

2 回答 2

3

删除 from 的分配personngOnInit()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

于 2019-04-03T12:40:58.263 回答
2

这是因为ngOnInit被追赶ngOnChanges。所以你首先设置它,然后立即在你的ngOnInit.

请参阅此处的工作示例。

基本上将您的组件人员属性更改为:

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: ''
};
于 2019-04-03T12:40:42.230 回答