Ionic&Angular:使用ngFor插入函数名称

时间:2018-09-29 17:45:14

标签: arrays angular ionic-framework ngfor function-call

我如何通过* 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)"

这有可能吗?
并建议按照我的方式进行操作吗?

谢谢!

2 个答案:

答案 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>

Here is a StackBlitz demo

答案 1 :(得分:1)

我建议使用@ user184994的解决方案,绑定this上下文并使用引用,但是如果您仍然想使用字符串,则可以通过this['methodName'](parameter)来访问组件的方法,在我的示例中看起来像this[a.function](user)

这里是STACKBLITZ