#angular #ionic-framework
#angular #ionic-framework
Вопрос:
Я только начал кодировать неделю назад, и я пытаюсь сделать так, чтобы в моем приложении Ionic (я использую Ionic CLI версии 5.4.16) появились 2 кнопки, первая из которых является кнопкой списка действий, а вторая — кнопкой оповещения. Я копирую код из официальной документации ionic, но я сталкиваюсь с проблемой при попытке экспортировать, а затем ссылаться на функцию в моем AlertClass (расположенном в моем файле home.page.ts) в моем home.page.html . Я получаю следующую ошибку:
Identifier 'presentAlert' is not defined. The component declaration, template variable declarations, and element references do not contain such a member
Будем признательны за любую помощь 🙂
Вот мой home.page.html код кнопки:
<ion-button (click)="presentActionSheet()" >Action Sheet</ion-button>
<ion-button (click)="presentAlert()">Alert</ion-button>
Вот мой код home.page.ts:
import { Component } from '@angular/core';
import { ActionSheetController } from '@ionic/angular';
import { AlertController } from '@ionic/angular';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
constructor(public actionSheetController: ActionSheetController) {}
async presentActionSheet() {
const actionSheet = await this.actionSheetController.create({
header: 'Albums',
cssClass: 'my-custom-class',
buttons: [{
text: 'Delete',
role: 'destructive',
icon: 'trash',
handler: () => {
console.log('Delete clicked');
}
}, {
text: 'Share',
icon: 'share',
handler: () => {
console.log('Share clicked');
}
}, {
text: 'Play (open modal)',
icon: 'caret-forward-circle',
handler: () => {
console.log('Play clicked');
}
}, {
text: 'Favorite',
icon: 'heart',
handler: () => {
console.log('Favorite clicked');
}
}, {
text: 'Cancel',
icon: 'close',
role: 'cancel',
handler: () => {
console.log('Cancel clicked');
}
}]
});
await actionSheet.present();
}
}
@Component({
selector: 'alert-example',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class AlertClass {
constructor(public alertController: AlertController) {}
async presentAlert() {
const alert = await this.alertController.create({
cssClass: 'my-custom-class',
header: 'Alert',
subHeader: 'Subtitle',
message: 'This is an alert message.',
buttons: ['OK']
});
await alert.present();
}
}
И вот мой код home.module.ts:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { IonicModule } from '@ionic/angular';
import { FormsModule } from '@angular/forms';
import { HomePage } from './home.page';
import { AlertClass } from './home.page';
import { HomePageRoutingModule } from './home-routing.module';
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
HomePageRoutingModule,
],
declarations: [
HomePage,
AlertClass
],
})
export class HomePageModule {}
Ответ №1:
Хорошо, итак, вы хотите выдавать предупреждение при нажатии на «Alert» ion-button
. Для этого вы используете привязку событий Angular, как и следовало бы. Как указано в документах Angular, приведенном в разделе template statment, presentAlert()
в данном случае должно быть найдено в этом компоненте.
Однако, насколько я вижу, ваша функция presentAlert()
вместо этого определена в экспортируемом классе AlertClass
. Итак, что вы хотите сделать, это переместить presentAlert()
в HomePage
класс вместе с presentActionSheet()
.
Если вы хотите модулировать функцию оповещения, я предлагаю заглянуть в сервисы, потому что это похоже на то, что вы намеревались сделать с AlertClass
.
tldr: переместите presentAlert()
в HomePage
класс вместе с presentActionSheet()
.
Комментарии:
1. Ах, спасибо. Я попробую этот подход. В итоге я создал сервисы с одним классом для каждого сервиса, и в каждом сервисе я разместил свои функции. Затем я создал функцию, ссылающуюся на каждую из моих служб в моем файле home.page.ts. Затем в моем home.page.html файл, я отсылал каждую кнопку к определенной функции в моем home.page.ts. Этот подход чрезмерно сложен, поэтому я постараюсь реализовать ваш подход при первой возможности. Еще раз спасибо за ваш ответ!
2. Ха-ха, да, это немного сложно, но это действительно полезно, чтобы избежать повторения одного и того же кода, и именно так я также управляю своими оповещениями. Если вы хотите, после добавления класса service в конструктор, вы можете вызвать функцию service в html, например: (click)=»this.ServiceClass.functionInService()».
3. О, конечно! Спасибо! 🙂