Ionic 3:隐藏侧边菜单时出错(无法读取 null 的 属性 'raf')
Ionic 3: Error when hide Side Menu (Cannot read property 'raf' of null)
我有一个 Ionic v3 应用程序,它有一个登录页面和一个只有在用户登录时才会出现的侧边菜单(带有注销按钮)。
当我注销时,侧边菜单消失了,因为 ion-menu 中的 *ngIf。然后发生此错误:
TypeError: Cannot read property 'raf' of null
at http://localhost:8100/build/vendor.js:21030:23
我的代码:
app.component.ts:
logout(): void {
this._userService.logout();
this.nav.setRoot(LoginPage);
}
get loggedUser() {
return this._userService.loggedUser();
}
app.html:
<ion-menu [content]="content" *ngIf="loggedUser">
<ion-content>
<ion-item id="header-menu">
<h2>{{ loggedUser?.name }}</h2>
<p>{{ loggedUser?.email }}</p>
</ion-item>
<ion-list>
<button menuClose ion-item (click)="logout()"> Exit </button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav [root]="rootPage" main #content swipeBackEnabled="false"></ion-nav>
user.service.ts:
private _loggedUser: any;
logout() {
this._loggedUser = null;
}
get loggedUser() {
return this._loggedUser;
}
最小可重现示例:
https://stackblitz.com/edit/ionic-offg7d
重现步骤:点击登录按钮,点击左侧菜单,点击退出选项
我建议您不要在离子菜单上使用 *ngIf,因为这会产生问题。
您可以尝试使用MenuController。我用我的解决方案测试了您创建的示例并且它有效。请参阅下面的菜单控制器实现。
App.html
<ion-menu [content]="content">
<ion-content>
<ion-item id="header-menu">
<h2>Name:</h2>
<p>{{ loggedUser?.name }}</p>
</ion-item>
<ion-list>
<button menuClose ion-item (click)="logout()"> Exit </button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav #content [root]="rootPage"></ion-nav>
app.component.ts
import { Component } from '@angular/core';
import { Platform, MenuController, App } from 'ionic-angular';
import { LoginPage } from '../pages/login/login';
import { UserService } from '../service/user.service';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage:any = LoginPage;
constructor(platform: Platform, private userService: UserService,
private menu: MenuController, private app: App) {
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.
this.menu.enable(false);
});
}
logout() {
this.menu.enable(false);
this.userService.logout();
this.app.getActiveNav().setRoot(LoginPage);
}
}
login.ts
import { Component } from '@angular/core';
import { NavController, MenuController } from 'ionic-angular';
import { HomePage } from '../home/home';
import { UserService } from '../../service/user.service';
@Component({
selector: 'login-home',
templateUrl: 'login.html'
})
export class LoginPage {
login = 'name';
password = 'email@email.com';
constructor(public navCtrl: NavController, private userService: UserService,
private menu: MenuController) {
}
doLogin() {
let user = {
name: this.login,
password: this.password
}
this.userService.login(user);
this.navCtrl.setRoot(HomePage);
this.menu.enable(true);
}
}
我有一个 Ionic v3 应用程序,它有一个登录页面和一个只有在用户登录时才会出现的侧边菜单(带有注销按钮)。
当我注销时,侧边菜单消失了,因为 ion-menu 中的 *ngIf。然后发生此错误:
TypeError: Cannot read property 'raf' of null
at http://localhost:8100/build/vendor.js:21030:23
我的代码:
app.component.ts:
logout(): void {
this._userService.logout();
this.nav.setRoot(LoginPage);
}
get loggedUser() {
return this._userService.loggedUser();
}
app.html:
<ion-menu [content]="content" *ngIf="loggedUser">
<ion-content>
<ion-item id="header-menu">
<h2>{{ loggedUser?.name }}</h2>
<p>{{ loggedUser?.email }}</p>
</ion-item>
<ion-list>
<button menuClose ion-item (click)="logout()"> Exit </button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav [root]="rootPage" main #content swipeBackEnabled="false"></ion-nav>
user.service.ts:
private _loggedUser: any;
logout() {
this._loggedUser = null;
}
get loggedUser() {
return this._loggedUser;
}
最小可重现示例: https://stackblitz.com/edit/ionic-offg7d
重现步骤:点击登录按钮,点击左侧菜单,点击退出选项
我建议您不要在离子菜单上使用 *ngIf,因为这会产生问题。
您可以尝试使用MenuController。我用我的解决方案测试了您创建的示例并且它有效。请参阅下面的菜单控制器实现。
App.html
<ion-menu [content]="content">
<ion-content>
<ion-item id="header-menu">
<h2>Name:</h2>
<p>{{ loggedUser?.name }}</p>
</ion-item>
<ion-list>
<button menuClose ion-item (click)="logout()"> Exit </button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav #content [root]="rootPage"></ion-nav>
app.component.ts
import { Component } from '@angular/core';
import { Platform, MenuController, App } from 'ionic-angular';
import { LoginPage } from '../pages/login/login';
import { UserService } from '../service/user.service';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage:any = LoginPage;
constructor(platform: Platform, private userService: UserService,
private menu: MenuController, private app: App) {
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.
this.menu.enable(false);
});
}
logout() {
this.menu.enable(false);
this.userService.logout();
this.app.getActiveNav().setRoot(LoginPage);
}
}
login.ts
import { Component } from '@angular/core';
import { NavController, MenuController } from 'ionic-angular';
import { HomePage } from '../home/home';
import { UserService } from '../../service/user.service';
@Component({
selector: 'login-home',
templateUrl: 'login.html'
})
export class LoginPage {
login = 'name';
password = 'email@email.com';
constructor(public navCtrl: NavController, private userService: UserService,
private menu: MenuController) {
}
doLogin() {
let user = {
name: this.login,
password: this.password
}
this.userService.login(user);
this.navCtrl.setRoot(HomePage);
this.menu.enable(true);
}
}