angular - 如何从另一个组件中的组件调用函数?
问题描述
我的问题是我有两个组件(我们称它们为comp1和comp2),我必须从 comp2 调用 comp1 中的函数,并show_it(list)
使用来自comp2的一些数据。所以目前如果我用一个在comp2中实现的按钮轻松触发它,它就可以解决。但是我现在的意图是,我想通过单击带有事件的标签来触发comp1中comp2的功能。有没有人可以解决我的问题?(click)
我如何在 home.html 中调用 comp1 和 comp2:
<comp1 [list]="lists" (emitList)="onListUpdate($event)"></comp1>
<comp2 [list]="additionalInformationList"></comp2>
我的 home.ts 的 onListUpdate 函数:
onListUpdate(list: {item:string}[]){
this.additionalInformationList=list;
console.log(list);
}
我的 comp1 的 .html:
div>
<ion-list>
<ion-item *ngFor="let list of list">
<ion-label (click)="updateList(list)">{{list.item.free_text}}</ion-label>
<ion-checkbox *ngIf="list.item.checkbox==true" disabled="false"></ion-checkbox>
</ion-item>
</ion-list>
我的 comp1 的 .ts:
@Component({
selector: 'caiditems',
templateUrl: 'caiditems.html'
})
export class CaiditemsComponent {
transformedList=[];
@Input()
list = [];
@Output()
emitList = new EventEmitter<{item:string}[]>();
constructor() {
this.emitList.emit(this.list);
}
updateList(list) {
if(list.item.additional_information!=null){
this.transformedList=[
{item: {id: list.item.id, free_text: list.item.free_text, checkbox: list.item.checkbox, additional_information: list.item.additional_information}}]
console.log("not empty")
}
else{
this.transformedList=[{item: {id: list.item.id, free_text: list.item.free_text, checkbox: list.item.checkbox, additional_information: ""}}]
console.log("empty")
}
this.emitAdditionalinformations(this.transformedList);
console.log('additional information list updated')
}
emitAdditionalinformations(transformedList){
this.emitList.emit(this.transformedList);
console.log('list emited');
}
我的comp2 .html:
<div>
<button ion-button (click)="show_it(list)">show it to meeeeeee</button><br>
<ion-label>{{additionalinformation}}<br><br></ion-label>
</div>
我的comp2 .ts:
@Component({
selector: 'caidadditionalinformations',
templateUrl: 'caidadditionalinformations.html'
})
export class CaidadditionalinformationsComponent {
additionalinformation="hi";
@Input()
list = [];
constructor() {
}
show_it(list){
console.log(list);
if(list[0].item.additional_information!=""){
console.log(list[0].item.additional_information);
this.additionalinformation=list[0].item.additional_information;
}
else{
this.additionalinformation="no additional informations";
}
}
解决方案
从这段代码中剪下:
<comp1 [list]="lists" (emitList)="onListUpdate($event)"></comp1>
<comp2 [list]="additionalInformationList"></comp2>
我假设comp1
两者comp2
都是HomePage
. 当您从 中单击一个标签时comp1
,该onListUpdate($event)
方法会在 中执行HomePage
,对吗?
您可以在 中获取comp2
组件的引用HomePage
,然后show_it()
使用该引用调用方法。
它会是这样的:
@Component(...)
export class HomePage {
// Get a reference of the component instance
@ViewChild(CaidadditionalinformationsComponent) comp2: CaidadditionalinformationsComponent;
onListUpdate(list: {item:string}[]){
this.additionalInformationList = list;
console.log(list);
// Use the reference to call the public method
this.comp2.show_it(list);
}
}
如果这在您的应用程序上下文中没有意义,请告诉我,也许创建一个stackblitz项目会帮助我们更好地理解您的特定场景。
还有一些其他方法可以在组件之间共享数据:
- 使用共享服务,您可以在其中保存数据,并且两个组件都可以从那里读取数据
- 使用Ionic 事件,以便两个组件都可以发布/订阅数据的更改,而不需要 HomePage 作为中介。
推荐阅读
- html - 使用输入类型图像时无法导航到 IE 和 Edge 中的表单操作
- php - phpAES给定的最终块未正确填充
- php - 如何计算不同大小数组的 PhP 协方差?
- c# - 将 ModernUI 的基本页面制作为 MainWindow 的 Strech 大小
- java - 从处理表单提交指南(Spring 入门指南)中获取代码错误
- javascript - foreach中的条件语句?
- sql - SQL Server 对 JSON 的支持是否可以替代 MongoDB 等 NoSql 解决方案?
- javascript - 如何将单击的按钮的文本内容保存到变量中
- wpf - WPF:在我的组合框工具提示上显示我的所有对象属性
- sql - 选择常用值并添加它们 SQL