我正在使用递归查询构建器表单,该表单类似于this在angular 7中具有反应形式。意味着,用户可以通过单击Add rule
来继续添加并行规则,并且可以通过单击Add group
来添加组。
我创建了两个组件,QueryDesignerComponent
和QueryComponent
。 QueryDesignerComponent
保存外部容器,条件为AND
和OR
,QueryComponent
保存行输入,即LHS
,operator
和RHS
。
当用户单击Add rule
时,我只是通过在QueryComponent
内使用QueryDesignerComponent
推送一个条目来扩展规则。我用*ngFor
重复一遍。
当用户单击Add group
时,我正在QueryDesignerComponent
内调用QueryComponent
,这使其递归。我用*ngFor
重复一遍。
我已经完成了实现并在有角度环境的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-->
这就是我创建自定义角度元素的方式,
@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
,第二个实例接收正确的值。我遵循why ngOnInit called twice?,关联了github issue和ngOnInit and Constructor are called twice,但是我没有运气!
有谁知道我该如何摆脱这个问题?任何帮助/指导将不胜感激!
最佳答案
我也有同样的问题,Angular Elements也有。
问题是我在Angular7组件内调用了Angular7组件,在app.module.ts上,我用与Angular7组件名称相同的名称自举了子组件。
当父级调用my-child-component时,它同时调用了Angular7和Custom Element。
因此,解决方法是在这种情况下使用不同的名称。
关于javascript - Angular元素两次调用组件构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54632686/