我如何通过* ngFor插入函数调用,而此调用是从我要遍历的数组中插入的字符串而来的?
我的数组包含用户动作列表,这些动作由其功能名称(以及其他功能名称)描述。模板的一部分应使用Ionic的assert(sizeof(int) > sizeof(bool));
指令为每个用户条目列出这些操作。我不想写下每个动作,而是想使用ion-fab
遍历列表,并将每个函数名插入*ngFor
属性中。
但是,我当前的解决方案不起作用。
这是我的代码:
课程
(click)
模板
constructor(
public navCtrl: NavController,
public navParams: NavParams,
private usersProv: Users
) {
this.userActions = [
{
'label' : 'Edit',
'function' : 'editUser',
'icon' : 'ios-create-outline',
'color' : 'primary'
},
{
'label' : 'Remove',
'function' : 'removeUser',
'icon' : 'ios-trash-outline',
'color' : 'yellow'
},
{
'label' : 'Send message',
'function' : 'sendMessageToUser',
'icon' : 'ios-send-outline',
'color' : 'secondary'
}
];
console.info('userActions', this.userActions);
}
这是我得到的错误:
<ion-fab right>
<button ion-fab mini color="light">
<ion-icon name="ios-arrow-dropleft"></ion-icon>
</button>
<ion-fab-list side="left">
<div *ngFor="let action of userActions">
<button ion-fab mini color="{{action.color}}" title="{{action.label}}" (click)="action.function(user)">
<ion-icon name="{{action.icon}}"></ion-icon>
</button>
</div>
</ion-fab-list>
</ion-fab>
使用大括号(ERROR TypeError: "_v.context.$implicit.function is not a function"
)插入也无济于事。错误是:
(click)="{{action.function}}(user)"
这有可能吗?
并建议按照我的方式进行操作吗?
谢谢!
答案 0 :(得分:4)
您应该保留对函数的引用,而不是使用字符串
userActions = [
{
'label' : 'Edit',
'function' : this.editUser.bind(this),
'icon' : 'ios-create-outline',
'color' : 'primary'
},
{
'label' : 'Remove',
'function' : this.removeUser.bind(this),
'icon' : 'ios-trash-outline',
'color' : 'yellow'
},
{
'label' : 'Send message',
'function' : this.sendMessageToUser.bind(this),
'icon' : 'ios-send-outline',
'color' : 'secondary'
}
];
这里我使用的是bind
,因此调用函数时我们不会丢失this
的上下文。
然后,您可以在HTML中这样调用它:
<button (click)="a.function(user)">{{a.label}}</button>
答案 1 :(得分:1)
我建议使用@ user184994的解决方案,绑定this
上下文并使用引用,但是如果您仍然想使用字符串,则可以通过this['methodName'](parameter)
来访问组件的方法,在我的示例中看起来像this[a.function](user)
。
这里是STACKBLITZ。