【问题标题】:ngOnChange is not called when the parent updates the child父更新子时不调用ngOnChange
【发布时间】:2021-07-01 05:58:38
【问题描述】:

我想知道 ngOnChanges 回调是如何工作的。所以我添加了它来观察使用 Input 装饰器注释的属性的变化,如下所示:

@Input() postsToAddToList: Post[] = [];

现在,当我编译代码时,我添加了一些值,这些值会导致使用@Input 注释的属性发生更改,但这不会导致调用和执行 ngOnChanges 回调。请查看下面发布的屏幕截图中显示的日志。

我想查看浏览器中显示的 ngOnChanges 中的日志。 请让我知道是什么阻止了正确调用和调用 ngOnChanges

app.component.ts

import { Component } from '@angular/core';
import { Post } from './post-create/post-create.component';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'binding2';
  postsArray: Post[] = [];

  onReceiveSubmittedEvtEmitter(post: Post) {
    this.postsArray.push(post);
    console.log("onReceiveSubmittedEvtEmitter->: post.title: " + post.title);
    console.log("onReceiveSubmittedEvtEmitter->: post.content:" + post.content);
  }
}

app.component.html

<app-post-create (onPostSubmittedEvtEmitter)="onReceiveSubmittedEvtEmitter($event)"></app-post-create>
<app-post-list [postsToAddToList]="postsArray"></app-post-list>

post-list.component.ts

import { Component, Input,OnInit, OnChanges, SimpleChanges,Output, EventEmitter } from '@angular/core';
import { Post } from '../post-create/post-create.component';

@Component({
  selector: 'app-post-list',
  templateUrl: './post-list.component.html',
  styleUrls: ['./post-list.component.css']
})
export class PostListComponent implements OnInit {

  constructor() {}

  @Input() postsToAddToList: Post[] = [];
  ngOnInit(): void {}
  
  ngOnChanges(changes: SimpleChanges) {

    for (let changedProperty in changes) {
      if (changes.hasOwnProperty(changedProperty)) {
        
        console.log("ngOnChanges->: changedProperty: " + changedProperty);
        console.log("ngOnChanges->: changedProperty:" + changedProperty);

        switch(changedProperty) {
          case 'postsToAddToList':
            console.log("ngOnChanges->: changes[changedProperty].previousValue: " + changes[changedProperty].previousValue);
            console.log("ngOnChanges->: changes[changedProperty].currentValue):" + changes[changedProperty].currentValue);
            break;
        }
      }
    }
  }
}

post-list.component.html

<!-- post-list.component.html -->
<h3>List</h3>

<ng-container *ngIf="postsToAddToList.length; else elseTemplate">

    <ul class="list-group">
        <li class="list-group-item" *ngFor="let post of postsToAddToList; let i = index">
            <h5>{{i+1}}) {{post.title}}</h5>
            <p>
                {{post.content}}
            </p>
        </li>
    </ul>

</ng-container>
<ng-template #elseTemplate>

    <div class="alert alert-danger" role="alert">
        No Post Found!
    </div>

</ng-template>

错误截图

【问题讨论】:

  • changes.postsToAddToList.currentValue 足以代替循环
  • @AdarshMohan 我试过了..它没有解决问题..我收到相同的结果
  • @LetsamrIt 如果我的回答对您有所帮助。你愿意接受和支持吗

标签: javascript angular typescript angular-event-emitter ngonchanges


【解决方案1】:

由于您在父组件中使用push(),因此不会在子组件中调用ngOnChanges。除了使用push(),您还可以在每次发生更改时将值重新分配给postsToAddToList

【讨论】:

  • 澄清:输入的对象是通过引用比较的,由于是同一个数组,所以没有检测到变化
猜你喜欢
  • 2018-03-23
  • 2016-11-19
  • 2020-10-26
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多