【ionic2/3】ionic项目的src目录

创建sidemenu项目的命令: ionic start myApp sidemenu   ,创建了一个带有侧边栏的myApp项目。


在项目中,我们主要看src目录,这个目录就是我们开发的主要目录:

1、src/index.html

index.html 是 Ionic应用的主入口文件,其目的是设置脚本和CSS引导,然后开始运行我们的应用程序。这是我们项目的加载入口: (说白了就是,我们项目的所有页面都会在这个<ion-app>的容器里)


跟组件,应用加载入口

<ion-app></ion-app>

主要的脚本引用,自动生成

 <script src="cordova.js"></script>
 <script src="build/polyfills.js"></script>
 <script src="build/vendor.js"></script>
 <script src="build/main.js"></script>

2、src/app

入口文件夹

/app.component.ts

应用入口文件,每个应用程序都有一个根组件,用于控制应用程序的其余部分。


app.component.ts是项目的根组件,组织、管理其它组件,它的模板文件是app.html,在这个带有侧边菜单的项目中,app.html页面是:


app.component.ts中:


在这个模板中,我们设置了一个 ion-menu 作为侧面菜单,然后一个 ion-nav 组件作为主要内容区域。 ion-menu 菜单的 [content] 属性绑定到了我们 ion-nav 的本地变量 content 上。所以我们知道哪里会发生动作变化。

从以上代码可以看出,项目的rootPage设置的是HomePage,(HomePage的“容器”就是ion-nav这个组件,ion-nav这个组件跟ion-menu相当于同级,点击侧边菜单栏的按钮转换页面,但是页面的“容器”都是此页面的ion-nav组件)。

3、修改默认项目

当然,在一个完整的项目中,可能会有登录、注册页面,所以项目一启动跳转的应该是登陆页面,而登录页面是不需要有侧边菜单栏的,此时,我们可以修改代码。

当页面加载app.html页面时,只给此页面一个ion-nav组件承载页面,


在app.component.ts文件中设置rootPage为登录页面(或者是自己想要的页面),

this.rootPage = LoginPage;

当登录成功时,我们可以重新设置当前路由的根页面,例如在login.ts中,当登录成功,我们可以执行:

import { Component } from '@angular/core';
import { App, NavController } from 'ionic-angular';
import { AuthorizationServiceProvider } from '../../providers/authorization-service/authorization-service';
import { MainPage } from '../main/main';
@Component({
  selector: 'page-login',
  templateUrl: 'login.html',
})
export class LoginPage {
  constructor(
    public navCtrl: NavController,
    public app: App,
  ) {
  }
  model = {
    userName: null,
    password: null,
    client_type: 2
  };

  ionViewDidLoad() {
    console.log('ionViewDidLoad LoginPage');
  }
  onSubmit (form) {
    this.authService.authorize(this.model)
    .subscribe(
      token => {
        this.app.getRootNav().setRoot(MainPage);  //获取到当前的路由栈,设置根为MainPage(登录之后跳转的页面)
      },
      error => {
        console.error(error)
      })
  }

}

这样,MainPage此时就是当前app的根页面,

main.html

<ion-menu [content]="content">
  <ion-header>
    <ion-toolbar>
      <ion-title>Menu</ion-title>
    </ion-toolbar>
  </ion-header>

  <ion-content>
    <ion-list>
      <button menuClose ion-item *ngFor="let p of pages" (click)="openPage(p)">
        {{p.title}}
      </button>
    </ion-list>
  </ion-content>

</ion-menu>

<!-- Disable swipe-to-go-back because it's poor UX to combine STGB with side menus -->
<ion-nav [root]="rootPage" #myNav #content></ion-nav>

main.ts

import { Component, ViewChild } from '@angular/core';
import { App, NavController, Nav } from 'ionic-angular';
import { Keyboard } from '@ionic-native/keyboard';
import { HomePage } from '../home/home';
import { ListPage } from '../list/list';

@Component({
  selector: 'page-main',
  templateUrl: 'main.html',
})
export class MainPage {
  pages: Array<{title: string, component: any}>;
  rootPage;
  @ViewChild('myNav') nav: Nav
  constructor(
    public navCtrl: NavController,
    public app: App
  ) {
    this.pages = [
      { title: 'Home', component: HomePage },
      { title: 'List', component: ListPage }
    ];
    this.rootPage = HomePage;
  }
 
  ionViewDidLoad() {
    console.log('ionViewDidLoad LoginPage');
  }

  openPage(page) {
    this.nav.setRoot(page.component);
  }
}

可以如此理解:

在app.html的<ion-nav>相当于是一个父级路由栈,一开始承载的是login.html页面,此路由栈的根就是LoginPage,然后登录成功我们利用this.app.getRootNav().setRoot(MainPage)重新设置app.html中的<ion-nav>的根为MainPage,此时main.html页面又出现一个子路由栈,

< ion-nav [ root]= "rootPage" # myNav # content ></ ion-nav >

main.html页面的<ion-nav>跟此页面的<ion-menu>是同级的,侧边栏里的页面的直接承载者就是此<ion-nav>,在子路由栈中可以设置根页面,

this. nav. setRoot( page. component);
这样,路由的级别就相当于:父路由栈承载loginPage,登录成功承载MainPage,MainPage中又有子路由栈,子路由栈中承载各个页面

版权声明:本文为summer_na原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。