【问题标题】:How to navigate into an Ionic 2 app如何导航到 Ionic 2 应用程序
【发布时间】:2016-12-12 05:57:59
【问题描述】:

我正在尝试在 Ionic 2 中做一个小应用程序,但我无法导航... 我已经阅读了文档、导航内容、navController、StackOverflow 上的一些帖子……我尝试了几个小时,但我被卡住了!我有几个问题。

我必须找到一种在我的 app.js 中使用 navController 的方法,这要感谢 @viewChild 和 StackOF。我不完全理解原理。 我设置了rootPage: any = Login;。由于我的应用程序上有一个菜单,因此我在此页面上禁用了它。在按钮(click) 上,我将根this.nav.setRoot() 设置为HomePage。 现在从主页,在菜单中,我想浏览一些页面。我被困在这里。我使用了(click)="openPage(Messagerie)" 方法。 第一个问题,openPage() 中的参数未定义。然后我按照文档尝试了[navPush]="pageMessagerie"this.pageMessagerie = Messagerie; 方法,但效果不佳,没有任何反应。因此,我尝试将页面硬编码到我的 openPage() 函数中:this.nav.push(Messagerie);。在这里,我又遇到了另一个问题。我第一次调用 push() 时,页面似乎立即出现和消失,回到 HomePage。我第二次点击,它似乎工作。我可以进入 Messagerie 页面,然后通过导航栏上的返回按钮返回主页。

所以...我在这里,卡住了导航!我不知道该怎么办。 这是我的代码。


更新 好的,未定义的现在可以了。但我的导航仍然表现得很奇怪。当我在主页上使用this.nav.push() 时,我得到了这个工作流程: 单击 Messagerie :打开 Messagerie 并立即返回主页。 点击 Demandes :打开 Messagerie,立即 Demandes 并留在那里。 单击导航栏返回按钮:返回 Messagerie,返回 Demandes 并返回主页。当然,如果我每次都使用this.nav.setRoot(),但我失去了导航原则。


App.html

<ion-menu [content]="content">
    <ion-toolbar>
        <ion-title>Menu</ion-title>
    </ion-toolbar>
    <ion-content>
        <ion-list>
            <button ion-item menuToggle = "left">
                Mes informations
            </button>
            <button ion-item menuToggle = "left" (click)="openPage(Messagerie)">
                Ma messagerie
            </button>
            <button ion-item menuToggle = "left" (click)="openPage(Demandes)">
                Mes demandes
            </button>
        </ion-list>
    </ion-content>
</ion-menu>

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

App.ts

import {Component, ViewChild}  from '@angular/core';
import {Platform, ionicBootstrap, NavController} from 'ionic-angular';
import {StatusBar}  from 'ionic-native';
import {HomePage}   from './pages/home/home';
import {Messagerie} from './pages/messagerie/messagerie';
import {Demandes}   from './pages/demandes/demandes';
import {Login}      from './pages/login/login';

@Component({
    templateUrl: 'build/app.html' 
})

export class MyApp {

    @ViewChild('content') nav

    rootPage: any = Login;

    constructor(private platform: Platform) {
        platform.ready().then(() => {
            StatusBar.styleDefault();
        });
    }

    openPage(page) {
        console.log(page);
        this.nav.push(page);
    }
}

ionicBootstrap(MyApp);

Login.ts(使用 setroot)

import {Component}      from '@angular/core';
import {NavController, MenuController}  from 'ionic-angular';
import {FormBuilder, ControlGroup, Validators} from '@angular/common';
import {HomePage}       from '../home/home';

@Component({
    selector: 'mc-login',
    templateUrl: 'build/pages/login/login.html'
})
export class Login {

    loginForm: ControlGroup;

    loginChanged:       boolean = false;
    motdepasseChanged:  boolean = false;
    submitAttempt:      boolean = false;

    constructor(private nav: NavController, private formBuilder: FormBuilder, private menu: MenuController) {
        this.menu.enable(false);
        this.loginForm = formBuilder.group({
            login: ['', Validators.compose([Validators.maxLength(10), Validators.pattern('[a-zA-Z ]*'), Validators.required])],
            motdepasse: ['', Validators.compose([Validators.maxLength(10), Validators.pattern('[a-zA-Z ]*'), Validators.required])]
        });
    }

    elementChanged(input) {
        let field = input.inputControl.name;
        this[field+"Changed"] = true;
    }

    logintoapp() {
        this.submitAttempt = true;

        if(this.loginForm.valid) {
            this.logindatabase();
        } else {
            console.log("Nope");
        }    
    }

    logindatabase() {
        this.nav.setRoot(HomePage);
    }
}

我错过了什么吗?我究竟做错了什么 ? 非常感谢您的帮助!

【问题讨论】:

    标签: angular ionic-framework nav ionic2 viewchild


    【解决方案1】:

    你可以试试这个:

    在 app.ts 中,声明 nav 和下面的数组如下:

    @ViewChild(Nav) nav:Nav;
    
    browsePages:Array<{title:string, component:any}>;
    

    添加到您的构造函数(这只是需要稍后显式关闭菜单):

    private menu: MenuController
    

    在构造函数中声明要添加到菜单的页面:

    this.browsePages = [
            {title: 'Ma messagerie', component: Messagerie},
            {title: 'Mes demandes', component: Demandes}
        ];
    

    在 html 中替换您的按钮“Ma messagerie”和“Mes demandes”,如下所示:

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

    最后是你的 openPage 方法:

    openPage(page) {
        // close the menu when clicking a link from the menu
        this.menu.close();
        // navigate to the new page if it is not the current page
        this.nav.setRoot(page.component);
    }
    

    那是为了从菜单导航。

    现在关于登录页面的导航...用导航推送替换您的 setroot。一般来说,除非您确实需要设置根目录,否则我认为应该将页面推送到堆栈中进行导航,而不是再次设置根目录。所以基本上使用 navcontroller 上的 push 和 pop 来导航。

    *** 更新以转到下一页并从历史记录中删除当前页面

    logindatabase() {
        this.goToNextPageWithoutBack(HomePage);
    }
    
    private goToNextPageWithoutBack(page:any, params?:any) {
        this.nav.push(page, params).then(() => {
            this.removeCurrentViewFromHistory();
        });
    }
    
    private removeCurrentViewFromHistory() {
        const index = this.nav.getActive().index;
        this.nav.remove(0, index);
    }
    

    **** 更新

    然后在你的 homepage.html 添加显示菜单切换

    <ion-header>
    <ion-navbar>
    
    <button menuToggle start>
      <ion-icon name="ios-menu-outline"></ion-icon>
    </button>
    
    <ion-title>my-items</ion-title>
    </ion-navbar>
    </ion-header> 
    

    我试图从我的工作代码中提取这些行,希望它能帮助你。

    【讨论】:

    • 感谢所有这些建议来清理我的代码@Peter!但是当我使用push 而不是setRoot 时,我到达主页时带有一个带有后退箭头的导航栏,而不是菜单按钮......它不再是我的主页了。正如我对@tothefux 所说,导航的工作流程仍然存在问题。请检查我对他的回答的评论。实际上......如果我在每个 pageOpen() 上都使用 setRoot,它可以工作,但它不是解决方案,我会失去工作流程。
    • 你是对的,在“push”之后,你会进入一个页面,在该页面的导航中会显示“back”按钮。如果您想在无法返回的情况下进入下一页,您可以从历史记录中删除最后一页。我编辑了我的解决方案。这是我为解决我的应用程序中的“登录/主页”而实施的解决方案,不知道它是否是最好的,但它可以完成工作。
    • 感谢@Peter,您的更新运行良好,但我无法声明 @ViewChild(Nav) nav:Nav;无法找到“导航”。而@ViewChild('Nav') nav:'Nav';错误 TS2339:“导航”类型上不存在属性“setRoot”。所以我留在@ViewChild('content') nav;其实我想使用push()方法,不一定是从主页到Messagerie(收件箱),而是从收件箱到消息本身。它不起作用。我有一个奇怪的工作流程:单击 Messagerie = Messagerie,自动返回主页。单击需求 = 需求。单击返回按钮 = Messagerie,然后单击主页。
    • 很高兴听到这部分的工作。我猜用 push、goToNextPageWithoutBack 和 pop 你可以做你的第一个流程。第二个流程比较棘手,因为你想实现一种特殊的“背”,对吧?所以这可能有两个想法,第一个是自己照顾堆栈中的视图并删除你不想要的那个(你可以遍历导航堆栈并删除例如你不想要的索引或您不想要的页面实例)或另一个想法是在您想要的视图上实现您自己的后退按钮(调用推送操作)。这有帮助吗?
    • 不不,@Peter,没有特殊的返回功能!我在 GitHub 上上传了我的应用程序。 github.com/Xav20/Xav20 试着导航,你会发现问题。好吧,如果你当然想要!
    【解决方案2】:

    您需要将范围变量设置为实际页面。现在 (click)="openPage(Messagerie)" --> 传入的 Messagerie 是未定义的。您需要在组件中设置 this.Messagerie = Messagerie。

    【讨论】:

    • 感谢@tothefux!它解决了未定义的问题。我仍然在进入导航的工作流程方面遇到问题。当我点击 Messagerie 时,它​​会转到 Messagerie 并立即返回主页。我再次单击,它停留在 Messagerie 上,但是当我点击导航上的后退按钮时,我经过 Messagerie 两次。然后我点击 Demandes,好的,返回,我去 Messagerie 和 HomePage...1) "Messagerie" = Messagerie -&gt; HomePage 2) "Demandes" = Demandes. 3) "Back Button" = Messagerie -&gt; HomePage
    • 不酷的人啊。您运行的是哪个版本的 Ionic 2?
    • 我使用 Ionic 2 beta10。我真的不明白为什么导航会这样做。我阅读了文档,示例,它似乎以这种方式工作,但事实并非如此。然而它应该很简单!它只是推入导航...是否可能存在导航/rootNav/viewChild或其他问题?当我在任何地方使用 setRoot() 时,它当然可以工作,但是不再需要对导航进行管理。
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多