我正在使用sidemenu
模板开始我的应用。我想在sidemenu
中添加一个按钮,以便用户启动logout
警报模式以确认注销。这是我的代码:
app.component.ts:
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform } from 'ionic-angular';
import { StatusBar, Splashscreen } from 'ionic-native';
import { Home } from '../pages/home/home';
import { Profile } from '../pages/profile/profile';
import { Logout } from '../pages/logout/logout';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
rootPage: any = Home;
pages: Array<{title: string, component: any}>;
constructor(public platform: Platform, public logout:Logout) {
this.initializeApp();
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: Home },
{ title: 'Profile', component: Profile }
];
}
initializeApp() {
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
StatusBar.styleDefault();
Splashscreen.hide();
});
}
openPage(page) {
// Reset the content nav to have just this page
// we wouldn't want the back button to show in this scenario
this.nav.setRoot(page.component);
}
logoutApp(){ ///<-- call from static button
this.logout.presentConfirm(); ///<-- call
}
}
app.html:
<ion-menu [content]="content">
<ion-content>
<ion-list>
<button menuClose ion-item *ngFor="let p of pages" (click)="openPage(p)">
{{p.title}}
</button>
<button ion-item (click)="logoutApp()">
<!--Add this static button for logout-->
Log Out
</button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>
app.module.ts:
import { NgModule } from '@angular/core';
import { IonicApp, IonicModule } from 'ionic-angular';
import { MyApp } from './app.component';
import { Home } from '../pages/home/home';
import { Profile } from '../pages/profile/profile';
import { Logout } from '../pages/logout/logout';
@NgModule({
declarations: [
MyApp,
Home,
Profile,
Logout
],
imports: [
IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
Home,
Profile,
Logout
],
providers: []
})
export class AppModule {}
logout.ts:
import { Component } from '@angular/core';
import { AlertController } from 'ionic-angular';
@Component({
template: ``
})
export class Logout {
constructor(
public alertCtrl: AlertController
) { }
presentConfirm() {
let alert = this.alertCtrl.create({
title: 'Confirm Log Out',
message: 'Are you sure you want to log out?',
buttons: [
{
text: 'Cancel',
role: 'cancel',
handler: () => {
console.log('Cancel clicked');
}
},
{
text: 'Log Out',
handler: () => {
console.log('Logged out');
}
}
]
});
alert.present();
}
}
根据我的知识,这应该足够了。但是我收到了一个错误:
45EXCEPTION:。/ MyApp类中的错误MyApp_Host - 内联模板:0:0 引起:没有退出提供商!
但为什么我们需要provider
?有什么我错过了吗?
答案 0 :(得分:2)
Logout
不是提供者(它是一个组件),但您正在尝试将其注入MyApp
。从它的外观来看,你的意图似乎并不是要使Logout
成为一个组件。在这种情况下,您应该replace
@Component()
@Injectable()
import { Injectable } from '@angular/core';
@Injectable()
export class Logout {
}
然后将其从@NgModule.declarations
和@NgModule.entryComponent
中删除,并将其添加到@NgModule.providers
@NgModule({
declarations: [
// Logout
],
entryComponents: [
// Logout
],
providers: [
Logout
]
})
class AppModule {}
如果Logout
应该是一个组件,并且您希望能够在MyApp
内访问该方法,那么您应该做的是创建一个服务可以注入Logout
和MyApp
,可以使用服务功能来显示警报。
答案 1 :(得分:2)
我弄清楚发生了什么。我过度思考解决方案。
使用alert controller
我们不需要其他组件。只需将alert controller
直接添加到app.component.ts
,然后调用presentalert()
函数:
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform, AlertController} from 'ionic-angular';///<-- add AlertController
import { StatusBar, Splashscreen } from 'ionic-native';
import { Home } from '../pages/home/home';
import { Profile } from '../pages/profile/profile';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
rootPage: any = Home;
pages: Array<{title: string, component: any}>;
constructor(public platform: Platform, public alertCtrl: AlertController
// , public logout:Logout
) {
this.initializeApp();
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: Home },
{ title: 'Participate', component: Participate },
{ title: 'Adopt', component: Adopt },
{ title: 'Result', component: Result },
{ title: 'Profile', component: Profile }
];
}
initializeApp() {
this.platform.ready().then(() => {
StatusBar.styleDefault();
Splashscreen.hide();
});
}
openPage(page) {
this.nav.setRoot(page.component);
}
presentLogout() { ///<-- call this function straight with static button in html
let alert = this.alertCtrl.create({
title: 'Confirm Log Out',
message: 'Are you sure you want to log out?',
buttons: [
{
text: 'Cancel',
role: 'cancel',
handler: () => {
console.log('Cancel clicked');
}
},
{
text: 'Log Out',
handler: () => {
console.log('Logged out');
}
}
]
});
alert.present();
}
}
您甚至不需要组件。