即使child_message
的值更改后,为什么也不会触发ngOnChanges?我看到将值从父级传递给子级时会触发ngDocheck()。但是它会多次触发,不仅是在传递值时,而且在初始化组件时都会触发。我想要在初始化后更改值时触发的东西。
ParentComponent.ts :
import { Component, OnInit,ViewChild,AfterViewInit, OnChanges, Input } from '@angular/core';
import { ChildComponent } from '../child/child.component';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit,OnChanges{
parent_message = "parent talking";
@Input() clicked:boolean =false;
constructor() { }
ngOnInit(){
//subscribing to message !!
//this.data.currentMesssage.subscribe(message => this.message =message)
}
ngOnChanges(){
console.log("change occured")
}
onClick(){
this.clicked = true;
}
}
ParentComponent.html :
<h1>Parent </h1>
Message:{{message}}
<button (click)='onClick()'>Send Message</button>
<div *ngIf="clicked; else notclicked">
<app-child [childMessage]="parent_message"> </app-child>
</div>
<ng-template #notclicked>
<app-child> </app-child>
</ng-template>
ChildComponent.ts :
import { Component, OnInit ,Input, Output,EventEmitter,OnChanges,DoCheck} from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css'],
})
export class ChildComponent implements OnChanges, DoCheck{
@Input() childMessage: string ="child here ";
//@Output()messageEvent = new EventEmitter<string>();
constructor() { }
ngOnChanges(){
console.log("change occured");
}
ngDoCheck(){
console.log("ngDoCheck");
}
}
ChildComponent.html :
<h1>Child</h1>
Say:{{childMessage}}
答案 0 :(得分:0)
尝试改用ngDoCheck()
生命周期挂钩。
在每次更改检测运行期间都会调用此挂钩。
export class ParentComponent implements OnInit, DoCheck {
message = "parent talking";
ngOnInit(){ }
ngDoCheck(){
console.log("change occured")
}
receiveMessage($event){
this.message = $event;
}
}
答案 1 :(得分:0)
实施有2个错误 -价值变化没有发生 -值未正确传递给子组件 您可以看到示例实现只是参考 https://angular.io/guide/component-interaction
答案 2 :(得分:0)
每当它检测到组件(或指令)的输入属性的更改时,Angular就会调用其ngOnChanges()方法。
如果您将任何属性与模板绑定,并且属性的值已更改,则ngOnChanges()
将触发。
我们需要记住,当bind属性是一个Object时,ngOnChanges()
仅在更改整个对象时才会触发。
只需在父模板中更改此行,它将正常工作。
<app-child (messageEvent)="receiveMessage($event)" [child_message]="message"> </app-child>
答案 3 :(得分:0)
如果要将消息从子级传递给父级,则需要这样实现
% option 2 - regexp ('$' to specify end of string)
files = files( ~cellfun( @isempty, regexp( files, [target, '$'], 'once' ) ) );
在父组件中,您可以从 @Output() // in child class
nextStep = new EventEmitter();
// you can call with data in some function like on click oo input changed
this.nextStep.emit({key: 'value'});
对象获得价值
$event
答案 4 :(得分:0)
您的代码有几个问题。
在父模板中,传递parent_message
中不存在的ParentComponent
属性bu
<app-child (messageEvent)="receiveMessage($event)" [child_message]="parent_message"> </app-child>
// ^^^^^^^^^^^
// this needs to be "message" property of ParentComponent
然后在同一行:
<app-child (messageEvent)="receiveMessage($event)" [child_message]="parent_message"> </app-child>
// ^^^^^^^^^^^
// this needs to be "childMessage" property of ChildComponent
并且正如official docs中所述,ngOnChanges
在更改了数据绑定的属性(例如@Input
)后会被触发。因此它不会发射。