对于副项目,我已经创建了一个ControlValueAccessor的新实现(矩阵选择AKA:一个表,您可以在其中选择和取消选择单元格)。可以提供选项输入以更改矩阵响应用户交互的行为方式。
我正在尝试创建一个“示例”页面,列出几个具有各种选项集的矩阵选择控件(有点像这样:https://material.angular.io/components/datepicker/overview)。对于每个示例,我想显示绑定值json,当用户与控件和选项json交互时更新。
这很容易做但重复(我有比下面提供的更多的变化):
<h1>Matrix Selection Component</h1>
<h2>Basic</h2>
<app-matrix-selection [formControl]="peopleAttributesControl"></app-matrix-selection>
<h3>Json</h3>
<pre>{{data|json}}</pre>
<h3>Options</h3>
<pre>{{options||json}}</pre>
<h2>With Labels</h2>
<app-matrix-selection [formControl]="peopleAttributesControl" [keys]="people" [selectables]="subjects" firstCellValue="Students / Subjects"></app-matrix-selection>
<h3>Json</h3>
<pre>{{data|json}}</pre>
<h3>Options</h3>
<pre>{{options||json}}</pre>
...
请注意,对于每个示例,我必须输出json和options值。
在我的脑海里(可能是错误的),我想做的是:
<h1>Matrix Selection Component</h1>
<h2>Basic</h2>
<app-example>
<app-matrix-selection [formControl]="peopleAttributesControl"></app-matrix-selection>
</app-example>
<h2>With Labels</h2>
<app-example>
<app-matrix-selection [formControl]="peopleAttributesControl" [keys]="people" [selectables]="subjects" firstCellValue="Students / Subjects"></app-matrix-selection>
</app-example>
...
并以这样的方式定义AppExampleComponent,即它可以输出传入的任何组件的数据和选项(不仅仅是选择矩阵,而是我可能用所述属性定义的任何其他内容)。
我正在努力找到任何资源来帮助我实现这一目标,我认为这可能是因为我正在努力说出我想要实现的目标。我想要一个组件来包装另一个组件,以便它可以向我展示与该组件交互的效果。
我认为其他方法是选项1:
<h1>Matrix Selection Component</h1>
<h2>Basic</h2>
<app-matrix-selection [formControl]="peopleAttributesControl"></app-matrix-selection>
<app-example [data]="peopleAttributes"></app-example>
<h2>With Labels</h2>
<app-matrix-selection [formControl]="peopleAttributesControl" [keys]="people" [selectables]="subjects" firstCellValue="Students / Subjects"></app-matrix-selection>
<app-example [data]="peopleAttributes" [options]="withLabelsOptions"></app-example>
...
或选项2:
<h1>Matrix Selection Component</h1>
<app-matrix-selection-example title="Basic" [data]="peopleAttributes"></app-matrix-selection-example>
<app-matrix-selection-example title = "With Labels" [data]="peopleAttributes" [keys]="people" [selectables]="subjects" firstCellValue="Students / Subjects" [data]="peopleAttributes" [options]="withLabelOptions"></app-matrix-selection>
...
但我真的不想为我创建的每个未来的ControlValueAccessor创建一个示例组件。
我觉得这里有一点关键的Angular功能。如果没有,你会怎么做?
解决方案一 - 使用ng-content
我忘记了一个非常基本的概念 - 内容儿童!以下链接帮助:https://medium.com/@tkssharma/understanding-viewchildren-viewchild-contentchildren-and-contentchild-b16c9e0358e
暂时忘记数据和选项要求,这将导致:
<app-example title="Basic">
<app-matrix-selection [formControl]="peopleAttributesControl"></app-matrix-selection>
</app-example>
然后示例组件如下所示:
<h2>{{title}}</h2>
<ng-content></ng-content>
ng-content将使用元素标签定义的元素输出到屏幕。
解决方案二 - 动态组件加载器
第2部分要求需要动态组件加载:https://angular.io/guide/dynamic-component-loader
将我的示例移到服务后,我最终得到了以下模板:
<h1>Matrix Selection Component</h1>
<app-example *ngFor="let example of examples" [title]="example.title" [example]="example"></app-example>
更干净!
示例对象的一个属性是Angular核心组件类型,可以使用app-example组件中的ComponentFactoryResolver动态加载。按照上面Angular.io链接中的说明进行操作。
然后,示例组件的模板可以处理重复结构:
<h2>{{title}}</h2>
<ng-template appExample></ng-template>
<h3>Bound Data Json</h3>
<pre>{{ example.componentAttributes.data | json }}</pre>
<div *ngIf="example.componentAttributes.options">
<h3>Options Json</h3>
<pre>{{ example.componentAttributes.options | json }}</pre>
</div>
需要注意的是,我未来的所有组件都必须具有通过实现接口强制执行的数据和选项属性 - 但这对我的目的来说很好。