angular - 如何从外部元素访问相应的组件?
问题描述
我有一个带有以下模板的组件:
<div (click)="changeValue(comp)" *ngFor="let type of types">
<div [ngSwitch]="type">
<app-a #comp [value]="'a'" *ngSwitchCase="'a'"></app-a>
<app-b #comp [value]="'b'" *ngSwitchCase="'b'"></app-b>
</div>
</div>
在里面changeValue
我想访问相应的组件(在这里a
或者b
可能有更多)。例如:
changeComp(comp: any) {
comp.value = 'new value'
}
我尝试了以下方法:(它们都有效,但我想要一个更好的解决方案):
将一个传递
id
给changeValue
函数id
并向每个组件添加一个属性(使用来自 foreach 的索引)。这可行,但问题是我不想要组件a
或b
拥有id
属性,这感觉像是一种解决方法而不是解决方案。id
我尝试使用属性而不是id
属性,但在内部change value
我无法将id
属性与组件相关联,因为@ViewChildren
无法同时获取elementRef
和componentRef
。合并组件
a
并b
转换为通用组件以移除开关。问题是在某些情况下最好有单独的组件。
这是一个有效的堆栈闪电战: https ://stackblitz.com/edit/angular-hxc8nc
解决方案
您可以将 value 属性添加到您键入的对象并像下面的代码一样绑定它:
<div #parent (click)="changeValue(type.value)" *ngFor="let type of types">
Click
<div [ngSwitch]="type.t">
<input #case_a [(ngModel)]="type.value" *ngSwitchCase="'a'" />
<input #case_b [(ngModel)]="type.value" *ngSwitchCase="'b'" />
</div>
</div>
这样 type.value 将始终具有来自任何可见子组件的值。在这里,我创建了一个有关其工作原理的示例: https ://stackblitz.com/edit/angular-bph8z3?file=src/app/app.component.ts
推荐阅读
- mysql - 内部连接查询中的问题不是唯一的别名表
- swift - 当内容更改时,如何让 contentView 调整大小?
- javascript - 如何在不使用引导程序且仅使用纯 CSS 的情况下进行多选?
- django - 如何将模板表中显示的信息导出到excel Django
- python - generate_blob_sas 创建无效的 SAS 令牌
- c++ - 为什么“std::getline”可以用分隔符分割字符串?
- python - 使用 QFileDialog.getSaveFileName 时如何知道在弹出窗口中单击了哪个按钮
- oracle - Oracle PL 等效于 foreach 循环
- javascript - 我可以在 Firebase Firestore .update() 方法中使用变量作为属性名称吗?(谷歌 Firebase 和 JavaScript)
- angular - 在Angular2中使用@Input装饰器初始化属性的正确方法是什么?