使用 Angular 元素调用组件构造函数两次
Component constructor is getting called twice with Angular elements
我正在研究递归查询构建器表单,它类似于 this,在 angular 7 中,具有反应式表单。意思是,用户可以通过点击Add rule
继续添加平行规则,也可以通过点击Add group
添加一个组。
我创建了两个组件,QueryDesignerComponent
和 QueryComponent
。 QueryDesignerComponent
包含外部容器,具有 AND
和 OR
条件,QueryComponent
包含行输入,即 LHS
、operator
和 RHS
.
- 当用户单击
Add rule
时,我只是通过在 QueryDesignerComponent
中推送一个带有 QueryComponent
的条目来增加规则。我用 *ngFor
. 重复这个
- 当用户单击
Add group
时,我在 QueryComponent
中调用 QueryDesignerComponent
,这使其递归。我用 *ngFor
. 重复这个
我已经完成了实施,它在 angular 应用程序中运行良好,它有一个 angular 环境。
现在,我正尝试将此流程移植到 angular elements 中,以使其可重用,无论环境如何。
这就是我将第一行 [QueryComponent
] 放在 QueryDesignerComponent
、
中的方式
<div class="qd--criteria">
<div class="row qd--body qd--clear-margin-lr">
<div class="col-md-12 qd--condition-container">
<query [data]="data" [operators]="operators" [(queryForm)]="queryForm"></query>
</div>
</div>
</div>
这样我就可以在 QueryComponent
、
中管理并行查询和组
<!--Top level container for query view | everything related should go here: start-->
<div class="qd--query-container" [formGroup]="queryForm" *ngIf="queryForm">
<div class="row" formArrayName="queries">
<!--Repeat the dynamically added/removed queries: start-->
<div class="col-md-12 qd--query-inputs-container" *ngFor="let query of currentQueries.controls; let queryIndex = index">
<div class="row qd--query-inputs" [formGroupName]="queryIndex">
<!--Actual query inputs: start-->
<div class="col-md-10 qd--condition-holder">
<div class="row no-gutter">
<!--Left hand side input: start-->
<!--Left hand side input: end-->
<!--Operator: start-->
<!--Operator: end-->
<!--Right hand side input: start-->
<!--Right hand side input: end-->
</div>
</div>
<!--Actual query inputs: start-->
<!--Group options: start-->
<!--Group options: end-->
<!--Group query: start-->
<div *ngIf="query !== undefined" class="ai--query-groups">
<div *ngFor="let group of getGroups(query).controls; let groupIndex=index" class="ai--query-group">
<query-designer
[data]="data"
[operators]="operators"
[queryForm]="group"
(removeQueryGroup)="removeQueryGroupHandler($event)"
[queryIndex]="queryIndex"
[groupIndex]="groupIndex"></query-designer>
</div>
</div>
<!--Group query: end-->
</div>
</div>
<!--Repeat the dynamically added/removed queries: end-->
</div>
</div>
<!--Top level container for query view: start-->
<!--Repeat the dynamically added/removed queries: start-->
<div class="col-md-12 qd--query-inputs-container" *ngFor="let query of currentQueries.controls; let queryIndex = index">
<div class="row qd--query-inputs" [formGroupName]="queryIndex">
<!--Actual query inputs: start-->
<div class="col-md-10 qd--condition-holder">
<div class="row no-gutter">
<!--Left hand side input: start-->
<!--Left hand side input: end-->
<!--Operator: start-->
<!--Operator: end-->
<!--Right hand side input: start-->
<!--Right hand side input: end-->
</div>
</div>
<!--Actual query inputs: start-->
<!--Group options: start-->
<!--Group options: end-->
<!--Group query: start-->
<div *ngIf="query !== undefined" class="ai--query-groups">
<div *ngFor="let group of getGroups(query).controls; let groupIndex=index" class="ai--query-group">
<query-designer
[data]="data"
[operators]="operators"
[queryForm]="group"
(removeQueryGroup)="removeQueryGroupHandler($event)"
[queryIndex]="queryIndex"
[groupIndex]="groupIndex"></query-designer>
</div>
</div>
<!--Group query: end-->
</div>
</div>
<!--Repeat the dynamically added/removed queries: end-->
这就是我创建自定义 angular 元素的方式,
@NgModule({
imports: [
CommonModule,
BrowserModule,
NgSelectModule,
FormsModule,
ReactiveFormsModule,
CoreModule
],
declarations: [
AppComponent,
QueryComponent,
QueryDesignerComponent
],
entryComponents: [QueryDesignerComponent],
providers: []
})
export class AppModule {
constructor(private injector: Injector) {
const strategyFactory = new ElementZoneStrategyFactory(QueryDesignerComponent, injector);
const customElement = createCustomElement(QueryDesignerComponent, { injector, strategyFactory });
customElements.define('query-designer', customElement);
}
ngDoBootstrap() { }
}
在第一个渲染中,它工作正常,我可以添加 n
个并行行。但是,当我单击 Add group
时,QueryDesignerComponent
的构造函数被调用了两次!这使得 QueryDesignerComponent
的第一个实例接收 undefined
并且第二个实例接收正确的值。
我关注了 , related github issue and ngOnInit and Constructor are called twice 但是,我发现运气不好!!
有谁知道我怎样才能解决这个问题?任何 help/guidance 将不胜感激!
我也有同样的问题,Angular 元素。
问题是我在 Angular7 组件中调用了 Angular7 组件,并且在 app.module.ts 上我引导了与 [=] 同名的子组件19=]7 组件名称。
当父级调用 my-child-component 时,它同时调用了 Angular7 组件和自定义元素组件。
因此,解决方法是在这种情况下使用不同的名称。
另一种可能是app.module.ts
中的下面一段代码
platformBrowserDynamic().bootstrapModule(AppModule).catch(err => { console.error(err) });
我尝试了这个并为 Angular 个元素工作。
从@NgModule 中删除了 Bootstrap 并在 ngDoBootstrap 中添加了自定义元素定义而不是构造函数。
请参考以下代码。
@NgModule({
declarations: [
MyComponent
],
imports: [
BrowserModule,
HttpClientModule
],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
providers: [MyService]
})
export class AppModule implements DoBootstrap{
constructor(private injector: Injector) {
}
ngDoBootstrap(appRef: ApplicationRef) {
const el = createCustomElement(MyComponent, { injector: this.injector });
customElements.define('my-widget', el);
}
}
我正在研究递归查询构建器表单,它类似于 this,在 angular 7 中,具有反应式表单。意思是,用户可以通过点击Add rule
继续添加平行规则,也可以通过点击Add group
添加一个组。
我创建了两个组件,QueryDesignerComponent
和 QueryComponent
。 QueryDesignerComponent
包含外部容器,具有 AND
和 OR
条件,QueryComponent
包含行输入,即 LHS
、operator
和 RHS
.
- 当用户单击
Add rule
时,我只是通过在QueryDesignerComponent
中推送一个带有QueryComponent
的条目来增加规则。我用*ngFor
. 重复这个
- 当用户单击
Add group
时,我在QueryComponent
中调用QueryDesignerComponent
,这使其递归。我用*ngFor
. 重复这个
我已经完成了实施,它在 angular 应用程序中运行良好,它有一个 angular 环境。
现在,我正尝试将此流程移植到 angular elements 中,以使其可重用,无论环境如何。
这就是我将第一行 [QueryComponent
] 放在 QueryDesignerComponent
、
<div class="qd--criteria">
<div class="row qd--body qd--clear-margin-lr">
<div class="col-md-12 qd--condition-container">
<query [data]="data" [operators]="operators" [(queryForm)]="queryForm"></query>
</div>
</div>
</div>
这样我就可以在 QueryComponent
、
<!--Top level container for query view | everything related should go here: start-->
<div class="qd--query-container" [formGroup]="queryForm" *ngIf="queryForm">
<div class="row" formArrayName="queries">
<!--Repeat the dynamically added/removed queries: start-->
<div class="col-md-12 qd--query-inputs-container" *ngFor="let query of currentQueries.controls; let queryIndex = index">
<div class="row qd--query-inputs" [formGroupName]="queryIndex">
<!--Actual query inputs: start-->
<div class="col-md-10 qd--condition-holder">
<div class="row no-gutter">
<!--Left hand side input: start-->
<!--Left hand side input: end-->
<!--Operator: start-->
<!--Operator: end-->
<!--Right hand side input: start-->
<!--Right hand side input: end-->
</div>
</div>
<!--Actual query inputs: start-->
<!--Group options: start-->
<!--Group options: end-->
<!--Group query: start-->
<div *ngIf="query !== undefined" class="ai--query-groups">
<div *ngFor="let group of getGroups(query).controls; let groupIndex=index" class="ai--query-group">
<query-designer
[data]="data"
[operators]="operators"
[queryForm]="group"
(removeQueryGroup)="removeQueryGroupHandler($event)"
[queryIndex]="queryIndex"
[groupIndex]="groupIndex"></query-designer>
</div>
</div>
<!--Group query: end-->
</div>
</div>
<!--Repeat the dynamically added/removed queries: end-->
</div>
</div>
<!--Top level container for query view: start-->
<!--Repeat the dynamically added/removed queries: start-->
<div class="col-md-12 qd--query-inputs-container" *ngFor="let query of currentQueries.controls; let queryIndex = index">
<div class="row qd--query-inputs" [formGroupName]="queryIndex">
<!--Actual query inputs: start-->
<div class="col-md-10 qd--condition-holder">
<div class="row no-gutter">
<!--Left hand side input: start-->
<!--Left hand side input: end-->
<!--Operator: start-->
<!--Operator: end-->
<!--Right hand side input: start-->
<!--Right hand side input: end-->
</div>
</div>
<!--Actual query inputs: start-->
<!--Group options: start-->
<!--Group options: end-->
<!--Group query: start-->
<div *ngIf="query !== undefined" class="ai--query-groups">
<div *ngFor="let group of getGroups(query).controls; let groupIndex=index" class="ai--query-group">
<query-designer
[data]="data"
[operators]="operators"
[queryForm]="group"
(removeQueryGroup)="removeQueryGroupHandler($event)"
[queryIndex]="queryIndex"
[groupIndex]="groupIndex"></query-designer>
</div>
</div>
<!--Group query: end-->
</div>
</div>
<!--Repeat the dynamically added/removed queries: end-->
这就是我创建自定义 angular 元素的方式,
@NgModule({
imports: [
CommonModule,
BrowserModule,
NgSelectModule,
FormsModule,
ReactiveFormsModule,
CoreModule
],
declarations: [
AppComponent,
QueryComponent,
QueryDesignerComponent
],
entryComponents: [QueryDesignerComponent],
providers: []
})
export class AppModule {
constructor(private injector: Injector) {
const strategyFactory = new ElementZoneStrategyFactory(QueryDesignerComponent, injector);
const customElement = createCustomElement(QueryDesignerComponent, { injector, strategyFactory });
customElements.define('query-designer', customElement);
}
ngDoBootstrap() { }
}
在第一个渲染中,它工作正常,我可以添加 n
个并行行。但是,当我单击 Add group
时,QueryDesignerComponent
的构造函数被调用了两次!这使得 QueryDesignerComponent
的第一个实例接收 undefined
并且第二个实例接收正确的值。
我关注了
有谁知道我怎样才能解决这个问题?任何 help/guidance 将不胜感激!
我也有同样的问题,Angular 元素。
问题是我在 Angular7 组件中调用了 Angular7 组件,并且在 app.module.ts 上我引导了与 [=] 同名的子组件19=]7 组件名称。
当父级调用 my-child-component 时,它同时调用了 Angular7 组件和自定义元素组件。
因此,解决方法是在这种情况下使用不同的名称。
另一种可能是app.module.ts
中的下面一段代码platformBrowserDynamic().bootstrapModule(AppModule).catch(err => { console.error(err) });
我尝试了这个并为 Angular 个元素工作。 从@NgModule 中删除了 Bootstrap 并在 ngDoBootstrap 中添加了自定义元素定义而不是构造函数。
请参考以下代码。
@NgModule({
declarations: [
MyComponent
],
imports: [
BrowserModule,
HttpClientModule
],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
providers: [MyService]
})
export class AppModule implements DoBootstrap{
constructor(private injector: Injector) {
}
ngDoBootstrap(appRef: ApplicationRef) {
const el = createCustomElement(MyComponent, { injector: this.injector });
customElements.define('my-widget', el);
}
}