我正在开发一个递归查询生成器表单,它类似于这,在角7中,使用了反应性表单。这意味着,用户可以通过单击Add rule继续添加并行规则,也可以通过单击Add group添加组。我创建了两个组件,QueryDesignerComponent和QueryComponent。QueryDesignerComponent持有带有AND和OR条件的外部容器,QueryComponent保存行输入,即LHS、operator和RHS。
Add rule时,我只是通过在QueryDesignerComponent中再按一个带有QueryComponent的条目来增加规则。我要在*ngFor中重复这一点。Add group时,我在QueryComponent中调用QueryDesignerComponent,这使得它是递归的。我要在*ngFor中重复这一点。我已经完成了在具有角环境的角应用程序中的实现和它的良好工作。
现在,我正试图将这个流移植到角元中,以使其可重用,而不管环境如何。
这就是我如何将第一行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,第二个实例可以接收正确的值。
我跟踪了为什么ngOnInit打了两次电话?,相关的github问题和ngOnInit和构造函数被调用两次,但是,我没有找到运气!!
有人知道我该怎么处理这个问题吗?任何帮助/指导都将不胜感激!
发布于 2019-03-01 21:23:01
我只是有同样的问题,也有棱角元素。
问题是,我在Angular7组件中调用了一个Angular7组件,而在app.module.ts上,我用与Angular7组件名称相同的名称引导了子组件。
当父调用我的子组件时,它同时调用了Angular7 1和自定义元素1。
因此,修复方法是在本例中使用不同的名称。
发布于 2019-04-15 14:08:14
另一种可能是app.module.ts中的以下代码
platformBrowserDynamic().bootstrapModule(AppModule).catch(err => { console.error(err) });发布于 2020-09-16 06:50:29
我试过这个并研究了角元素。从@NgModule中删除了引导带,并在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);
}
}https://stackoverflow.com/questions/54632686
复制相似问题