我有一个父组件,它使用@Input()
将一些数据(selectedId
(传递给子组件。
父模板
<child-component [selectedId]="selectedId"></child-component>
子组件按如下方式使用selectedId
:
子模板
<select [(ngModel)]="selectedId">
<option [value]="option.id" *ngFor="let option of options">{{option.name}}</option>
</select>
子组件
export class HelloComponent {
@Input()
set selectedId(id: any) {
this._selectedId = id;
}
get selectedId() {
return this._selectedId;
}
public _selectedId;
options = [
{
"id": "1",
"name": "Weekly"
},
{
"id": "2",
"name": "Bi-Weekly"
},
{
"id": "3",
"name": "Lunar"
},
{
"id": "4",
"name": "Monthly"
}
]
}
这非常有效。问题是当我直接从子组件更改所选项目时 - 不使用父组件。
当它无法按预期工作时,这是以下情况:
selectedId
从父组件填充(API 调用(- 使用手动更改选择选项(从
child-component
( - API 再次被调用,它应设置与步骤 1 中设置的 ID 相同的 ID。这怎么不会触发更改事件。我的假设是父组件不知道在子组件中完成的手动更改,因此它仍然保留对步骤 1 中
selectedId
的引用,并且不会触发步骤 3 中的更改,因为它是相同的 ID。
我在堆栈闪电战上重现了这个问题
我知道我可以使用Output()
和共享服务来解决此问题,但是还有其他方法可以通知父级有关更改检测的信息吗?
您可以使用@Output
在子组件发生更改时通知父组件
@Component({
selector: 'hello',
templateUrl: './hello.component.html',
styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent {
@Input()
set selectedId(id: any) {
this._selectedId = id;
console.log('Child change event --> ', id);
}
get selectedId() {
return this._selectedId;
}
@Output() selectedIdChange=new EventEmitter();
public _selectedId;
options = [
{
"id": "1",
"name": "Weekly"
},
{
"id": "2",
"name": "Bi-Weekly"
},
{
"id": "3",
"name": "Lunar"
},
{
"id": "4",
"name": "Monthly"
}
]
onChangeSelectedId(){
this.selectedIdChange.emit(this.selectedId);
}
}
并像这样设置值
<hello [(selectedId)]="selectedId"></hello>
方法 1:将此变量添加到共享服务并从那里使用它。每当孩子或父母修改它时,它就会更新。
方法 2:将输入从父组件传递到子组件并添加一个事件发射器,以便每当子组件中的值发生变化时,您应该发出一个事件来更新父组件中的值