【发布时间】:2021-10-13 02:28:04
【问题描述】:
在这个问题之前我made this question。基本上,我试图做到这一点,因此当提交单独组件中的表单时,它会创建一个组件的新实例,其中传入的值来自该组件实例上显示的表单。这些组件是在我将数据添加到 app.component.ts 中的数组时创建的。
感谢一个答案,我现在确实可以使用它,但是现在我正在尝试使它在提交不同组件中的表单时创建这些组件。
当表单中的数据添加到 app.component.ts 中的数组时,它会创建这些组件实例之一,但我只希望在通过 ngSubmit 提交表单时发生这种情况一个单独的组件,即 add-status-box.component.ts。
add-status-box.component.html:
<form [formGroup]="AddStatusBoxForm" (ngSubmit)='addStatusBox()'>
add-status-box.component.ts:
export class AddStatusBoxComponent implements OnInit, OnDestroy
{
message!: string;
subscripton!: Subscription;
constructor(private Form: FormBuilder, private data: StatusBoxService) { }
AddStatusBoxForm = this.Form.group({
name: ['']
});
ngOnInit(): void
{
this.subscripton = this.data.currentMessage.subscribe(name => this.name = name)
}
ngOnDestroy(): void
{
this.subscripton.unsubscribe();
}
addStatusBox()
{
this.data.changeMessage(this.AddStatusBoxForm.get('name')?.value);
this.dialogRef.close();
}
}
app.component.ts:
export class AppComponent implements OnInit, OnDestroy
{
name!: string;
subscription!: Subscription;
myNames: any[] = [];
constructor(private data: StatusBoxService) {}
ngOnInit(): void
{
this.subscription = this.data.currentName.subscribe(name => this.name = name)
this.myNames.push(this.name);
}
ngOnDestroy(): void
{
this.subscription.unsubscribe();
}
status-box.service.ts
export class StatusBoxService
{
private messageSource = new BehaviorSubject('defaulty');
currentMessage = this.messageSource.asObservable();
changeMessage(message: string)
{
this.messageSource.next(message);
}
}
当我调用 add-status-box.component.ts 中附加到表单 ngSubmit 的 addStatusBox() 时,名称字段输入被传递到通过changeMessage函数的StatusBoxService。
然后在 app.component.ts 的 ngInit() 函数中,我们订阅 StatusBoxService 并从表单中检索传入的名称值。然后将其分配给 name 属性。
最后我们将该名称添加到 myNames 数组中,但是我希望仅当我在 add-status-box.component.ts 中提交相同的表单时才发生将项目添加到数组中的关键步骤强>。因为正如你所看到的,我在 oninit() 期间向这个数组添加了项目。
我做了find this,似乎 ngSubmit 是一个 EventEmitter。看起来你可以订阅 EventEmitters。所以我可以在 app.component.ts 中的 app-status-box.component.ts 中订阅 ngSubmit,这样我就只当 ngSubmit 发生时,将项目添加到数组中。
我不确定这是否正确,如果正确,我不确定我将如何实现它。我之前从 StatusBoxService 检索名称值时使用过 subscibe,所以也许我可以做一些类似的事情?
任何帮助将不胜感激。
【问题讨论】:
-
您不能在
subscribe回调中移动this.myNames.push(this.name);吗?这样,只有在this.data.currentMessage发出一个新值时才会调用它(我希望在提交表单时会发生这种情况)。 -
另请注意,使用当前代码,您将在数组更新之前将
this.name推送到数组(subscribe是异步的)。 -
你能给我举个例子吗?我试过这个: this.subscription = this.data.currentMessage.subscribe(message => this.message = message, this.myConfigs.push(this.message));但它只是错误。
-
另外,我将如何纠正 this.name 在更新之前传递给数组的异步问题?
-
this.data.currentMessage.subscribe(message => { this.message = message; this.myConfigs.push(this.message); });
标签: angular form-submit angular-components angular-event-emitter ng-submit