Ionic & Angular: вставка имен функций с помощью ngFor
Как я могу вставить вызов функции через *ngFor, в то время как этот вызов приходит как вставленная строка из массива, который я перебираю?
Мой массив содержит список действий пользователя, которые описываются именами его функций (среди прочих). Шаблон имеет часть, которая должна перечислять эти действия для каждой записи пользователя, используя директиву Ionic 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)"
) также не помогает. Потом Ошибка:
`ERROR Error: "Uncaught (in promise): Error: Template parse errors: Parser Error: Got interpolation ({{}}) where expression was expected at column 0 in [{{action.function}}(user)]`
Возможно ли это вообще?
И можно ли подойти к этому так, как я это делаю?
Заранее спасибо!
2 ответа:
Вместо того, чтобы использовать строку, вы должны держать ссылку на функцию, например
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>
Я рекомендую использовать решение @user184994, привязать контекст
this
и использовать ссылку, но если вы все еще хотите использовать строки, вы можете получить доступ к методам компонента черезthis['methodName'](parameter)
, в моем примере это выглядит какthis[a.function](user)
.Здесь есть СТАКБЛИЦ.