ionic2 - 在sidemenu中添加注销

时间:2016-10-30 14:03:39

标签: angular typescript ionic2

我正在使用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?有什么我错过了吗?

2 个答案:

答案 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内访问该方法,那么您应该做的是创建一个服务可以注入LogoutMyApp,可以使用服务功能来显示警报。

答案 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();
}
}

您甚至不需要组件。