如何在 angular 中将数据从相同的多个子组件传递给父组件?
How to pass data from identical multiple child component to parent in angular?
我想将数据从多个相同的子组件传递到父组件。我怎样才能实现它。场景是我有一个日期选择器,我在父组件中循环了子组件。因此,当我 select 在所有子元素中设置日期时,我如何检索父组件中的日期,我的业务逻辑在父组件中进行服务调用。提前致谢。
您可以在父组件中为所有子组件及其各自的值保留一个数组。每当子组件中的日期值发生更改时,使用事件发射器将该值传递给父组件。请参阅以下示例:
Child.component.ts
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.scss'],
})
export class ChildComponent {
@Input() data: any;
@Output('selectionChanged') eventEmitter: EventEmitter<any> =
new EventEmitter<any>();
constructor() {}
onDateSelection(event: any) {
const dateStr = event.target.value; //Pick date value
this.eventEmitter.emit({ id: this.data.id, date: dateStr });
}
}
Child.component.html
<p>id: {{ data.id }}</p>
<input type="date" (change)="onDateSelection($event)" />
App.component.ts(在您的情况下,这将是父组件)
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
title = 'so-demo';
children: any[];
constructor() {
this.children = [{ id: 1 }, { id: 2 }, { id: 3 }];
}
ngOnInit() {}
dateSelectionChanged(data: any) {
const { id, date } = data;
this.children[id - 1].date = date;
// Call your service here, I'm just gonna write to console
console.log(this.children);
}
}
App.component.html
<p>Hola! Select a few of below dates:</p>
<ng-container *ngFor="let c of children">
<app-child
[data]="c"
(selectionChanged)="dateSelectionChanged($event)"
></app-child>
</ng-container>
您可以通过创建引用当前组件的提供程序来与 parent 组件对话。然后任何 child 都可以访问那个 parent。请参阅 Stackblitz.com.
上的完整代码
第一步是创建一个可以提供给您的 parent 并注入您的 children:
的令牌
export const PARENT_COMPONENT = new InjectionToken<ParentComponent>('ParentToken');
接下来在您的 parent 组件中添加一个引用自身的提供程序:
@Component({
providers: [
{
provide: PARENT_COMPONENT,
useExisting: forwardRef(() => ParentComponent),
},
],
})
export class ParentComponent {}
然后在你的 children 中,注入 parent:
export class ChildComponent {
constructor(
@Inject(PARENT_COMPONENT) private readonly parent: ParentComponent
) {}
}
现在 child 可以访问所有 parent 的功能,并且 child 在组件中的深度无关紧要,它可以是 child 甚至是盛大 child(或更深)。
我想将数据从多个相同的子组件传递到父组件。我怎样才能实现它。场景是我有一个日期选择器,我在父组件中循环了子组件。因此,当我 select 在所有子元素中设置日期时,我如何检索父组件中的日期,我的业务逻辑在父组件中进行服务调用。提前致谢。
您可以在父组件中为所有子组件及其各自的值保留一个数组。每当子组件中的日期值发生更改时,使用事件发射器将该值传递给父组件。请参阅以下示例:
Child.component.ts
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.scss'],
})
export class ChildComponent {
@Input() data: any;
@Output('selectionChanged') eventEmitter: EventEmitter<any> =
new EventEmitter<any>();
constructor() {}
onDateSelection(event: any) {
const dateStr = event.target.value; //Pick date value
this.eventEmitter.emit({ id: this.data.id, date: dateStr });
}
}
Child.component.html
<p>id: {{ data.id }}</p>
<input type="date" (change)="onDateSelection($event)" />
App.component.ts(在您的情况下,这将是父组件)
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
title = 'so-demo';
children: any[];
constructor() {
this.children = [{ id: 1 }, { id: 2 }, { id: 3 }];
}
ngOnInit() {}
dateSelectionChanged(data: any) {
const { id, date } = data;
this.children[id - 1].date = date;
// Call your service here, I'm just gonna write to console
console.log(this.children);
}
}
App.component.html
<p>Hola! Select a few of below dates:</p>
<ng-container *ngFor="let c of children">
<app-child
[data]="c"
(selectionChanged)="dateSelectionChanged($event)"
></app-child>
</ng-container>
您可以通过创建引用当前组件的提供程序来与 parent 组件对话。然后任何 child 都可以访问那个 parent。请参阅 Stackblitz.com.
上的完整代码第一步是创建一个可以提供给您的 parent 并注入您的 children:
的令牌export const PARENT_COMPONENT = new InjectionToken<ParentComponent>('ParentToken');
接下来在您的 parent 组件中添加一个引用自身的提供程序:
@Component({
providers: [
{
provide: PARENT_COMPONENT,
useExisting: forwardRef(() => ParentComponent),
},
],
})
export class ParentComponent {}
然后在你的 children 中,注入 parent:
export class ChildComponent {
constructor(
@Inject(PARENT_COMPONENT) private readonly parent: ParentComponent
) {}
}
现在 child 可以访问所有 parent 的功能,并且 child 在组件中的深度无关紧要,它可以是 child 甚至是盛大 child(或更深)。