当前位置: 首页 > 知识库问答 >
问题:

检测组件输入的属性在角度上的变化

洪胜涝
2023-03-14

我有一个角度组件,它有一个输入< code>Person

export class Person {
  public name = 'Initial Name';
}

export class PersonComponent implements OnInit, OnChanges {
  @Input() public person: Person;

  ngOnChanges(changes: SimpleChanges): void {
    console.log('changed');
  }
}

在这个组件的父组件中,如果我替换了作为子组件输入的Person对象,ngOnChanges()

但是,如果我只从父组件中更改Person对象的名称,

当输入的属性更改时,是否有任何方法在子组件中获得通知?


共有3个答案

施自珍
2023-03-14

如果使用getter,那么每次给定一个值,setter就会被执行。所以变通办法可以有两个变量

  @Input() person;
  @Input() 
  set changePerson(value)
  {
    console.log(this.person);
  }

所以,在你的父母中,你可以写

  <app-child [person]="person" [changePerson]="changePerson"></app-child>

  this.person.name="new name";
  this.changePerson=true;

另一个选项是在服务中使用EventEmitter,每次更改

    //Our service
    @Injectable({
      providedIn: 'root',
    })
    export class ChangeService {
      changed: EventEmitter<any>=new EventEmitter();
      emit(value:any)
      {
          this.changed.emit(value);
      }
    }

//Our parent
constructor (private changeService:ChangeService){}
  ngOnInit()
  {
    setTimeout(()=>{
      this.changeService.emit(this.person)

    })
    setTimeout(()=>{
      this.person.name="George";
      this.changeService.emit(this.person);
    },5000);
  }

//Our child
  person:any;
  ngOnInit() {
    this.changeService.changed.subscribe(res=>{
      this.person=res;
      console.log(res);
    })
  }
杜鸿彩
2023-03-14
匿名用户

您总是可以在< code>Person上创建一个观察对象,每当属性发生变化时,它就会发出。

从“rxjs”导入{ Subject };

export class Person {

  private _changes = new Subject<any>();
  private _name = 'Initial Name';

  // subscribe to this one
  public changes = this._changes.asObservable();

  set name(newName: string) {
    this._name = newName;
    this._changes.next({'name': newName});
  }

  get name() {
    return this._name;
  }

}

这样,您就可以订阅 person.changes,每次更改名称时都会发出一个值

当您编写 person.name = “Fred”时,将调用 setter,这反过来又会从可观察量发出新值。

酆浩邈
2023-03-14

不可以,ngOnChanges 钩子只会在引用更改时触发。通过在更改父组件中的 name 属性时执行此操作,可以轻松实现要执行的操作:

this.person = {...this.person, name: 'new value'};
 类似资料:
  • 我有一个父组件,它使用ajax请求检索对象数组。 该组件有两个子组件:一个以树结构显示对象,另一个以表格格式呈现其内容。父元素通过@input属性将数组传递给它们的子元素,子元素可以正确地显示内容。一切如预期。 当您更改对象中的某些字段时,就会出现问题:子组件不会收到这些更改的通知。只有当您手动将数组重新分配给其变量时,才会触发更改。 我已经习惯了使用Knockout JS,我需要获得类似于obs

  • 使用Angular ,我正在创建一个属性组件并向其中注入一个值。为此,我在这里跟随答案。 我想知道有没有一种方法,就像在AngularJS中一样,直接在组件中输入一个值,而不需要定义单独的< code>[form]=""。例如:<代码> 导致“。 我正在尝试将我的表单(通过变量)注入组件,但我不想进行其他绑定,例如根据这里的帖子,这应该是可能的,但我无法工作。自从更高的Angular版本以来,这种

  • 问题内容: 我有一个使用ajax请求检索对象数组的父组件。 该组件有两个子组件:一个子组件以树结构显示对象,另一个子组件以表格格式呈现其内容。父级通过@input属性将数组传递给其子级,它们会正确显示内容。一切都如预期。 当您更改对象内的某些字段时,会发生问题:子组件不会收到有关这些更改的通知。仅当您手动将数组重新分配给它的变量时,才会触发更改。 我已经习惯了使用Knockout JS,并且需要获

  • 我需要检测绑定角度中的值变化,并在值更改时执行函数 当更改时,我需要执行一些代码组件类。

  • 我有两个组件(父组件和一个子组件),我正在向子组件发送一个名为project的自定义对象,它会正确地更新/显示,但是当发生这种更改时,我想在子组件中执行另一个函数。是否可以检测项目对象何时更新,然后在子组件中运行该函数? 到目前为止,我已经通过以下代码取得了一些成就,但我不确定这是否是正确的方法。 编辑:我忘记提到输入是一个具有数组和不同属性类型的复杂对象。在代码示例中,我只比较了对象的一个属性。

  • 我有一个父组件(CategoryComponent)、一个子组件(videoListComponent)和一个APIService。 我的大部分工作都很好,即每个组件都可以访问json api,并通过Observables获取其相关数据。 当前video list组件只获取所有视频,我想将其筛选为特定类别中的视频,我通过将categoryId传递给子对象实现了这一点。 CategoryCompon