2016-05-19 18 views
0

Sie haben gerade Ionic 2 aktualisiert, um Angular 2 RC1 zu verwenden, was großartig ist, außer dass das Routing für mich immer noch etwas seltsam ist. Ich habe versucht, mit dem Update-Handbuch zu folgen, aber mein Nav ist hier noch undefiniert. Die alte getComponent-Methode hat funktioniert, aber sie wurden mit diesem Update beseitigt. Es funktioniert innerhalb einer Komponente oder einer Seite, aber nicht innerhalb eines Dienstes.Navigieren durch ViewChild in Ionic 2 Beta

Fehler Ich erhalte ist No provider for NavController!

import {IonicApp, NavController, Nav} from 'ionic-angular'; 
import {Injectable, ViewChild} from '@angular/core'; 
import {Http, HTTP_PROVIDERS, Headers} from '@angular/http'; 
import {HomePage} from '../pages/home/home'; 

@Injectable() 
export class User { 
    isLoggedIn: boolean = false; 
    username: string = 'jaruesink'; 
    constructor (public nav: NavController) { 
    } 
    login(username) { 
    this.isLoggedIn = true; 
    this.username = username; 
    this.nav.push(HomePage); 
    } 
    logout() { 
    this.isLoggedIn = false; 
    } 
} 

Antwort

2

Wenn diese Komponente die Wurzelkomponente ist, was bedeutet, dass es die ursprüngliche Komponente, die der Rest der App in geht, dann wäre die <ion-nav>ViewChild der sein Vorlage der Stammkomponente. Sie würden es genauso verwenden, wie Sie es oben haben.

Alle anderen Komponenten nach der Root-Komponente wird jedoch innerhalb der geladen, die eine NavController, die in jede Komponente, die in den Stamm <ion-nav> geladen wurde injiziert werden kann. So wird Ihre Kopfzeile in diesem Fall wahrscheinlich "innerhalb" einer <ion-nav> geladen, daher ist es in der Lage, seine Eltern NavController zu injizieren.

Ohne genau zu wissen, wie Sie Ihre App und Vorlagen Setup sind, ist meine Vermutung Sie dies die NavController wie Injektion versuchen sollte:

import {NavController} from 'ionic-angular'; 
import {Component, ViewChild} from '@angular/core'; 
import {User} from '../../services/user'; 
import {HeaderServices} from '../../services/header'; 
import {LoginPage} from '../../pages/login/login'; 

@Component({ 
    templateUrl: 'build/components/header/header.html', 
    selector: 'app-header' 
}) 
export class AppHeader { 

    constructor(public nav: NavController, public user: User, private header: HeaderServices) { 
    } 
    showLogin() { 
    this.nav.push(LoginPage); 
    } 
} 
+0

Dies funktionierte. Aus irgendeinem Grund, als ich NavController ausprobiert habe, bevor es einige Providerfehler hatte. Aber jetzt bin ich gut zu gehen. Vielen Dank! – jaruesink

+0

Hey Entschuldigung, ich wurde vorzeitig aufgeregt, haha. Dies funktioniert für Komponenten, aber nicht in meinem Dienst. Ich habe die Frage aktualisiert, um das zu berücksichtigen. Irgendwelche Vorschläge dafür? – jaruesink

+0

@adam Ich habe das gleiche Problem. Ich kann in meinen Diensten keine Nav-Referenz abrufen und habe sowohl die ViewChild- als auch die NavController-Methode ausprobiert. – nunoarruda

1

In Ionic Beta 11 mit Typoskript, es auch so gehen könnte:

import {Component, ViewChild} from '@angular/core'; 
import {Platform, ionicBootstrap, MenuController, NavController} from 'ionic-angular'; 
import {StatusBar} from 'ionic-native'; 
import {AboutPage} from './pages/about/about'; 

@Component({ 
    templateUrl: 'build/app.html', 
    providers: [NavController], 
}) 

export class MyApp { 
    @ViewChild('nav') nav : NavController; 
    private pages: any[]; 
    constructor(private platform: Platform, private menu: MenuController) { 
    this.rootPage = TabsPage; 
    this.menu = menu; 

    this.pages = [ 
     { title: 'About', component: AboutPage } 
    ]; 

    platform.ready().then(() => { 
     StatusBar.styleDefault(); 
    }); 
    } 

    openPage(page) { 
    this.menu.close() 
    this.nav.push(page.component); 
    }; 
} 

ionicBootstrap(MyApp); 

Genau dies tun:

import {ViewChild} from '@angular/core'; 

@App({ 
    templateUrl: '....', 
    providers: [....], 
    // this is the point 
    queries: { 
    nav: new ViewChild('content') 
    } 
}) 
gehen Sie vor

dann zu verwenden, wie Sie es vorher:

this.nav.setRoot(MyPage); 

Quelle: https://github.com/driftyco/ionic-conference-app/blob/master/app/app.js#L24-L26

+0

Sie haben das, wenn Sie in der App-Komponente sind, aber was ist mit einem Service? – jaruesink

+0

@jaruesink Okay, habe das nicht versucht. Aber * warum * möchtest du einen Nav-Controller in deinem Dienst haben? Hören Sie den Namen Nav * Controller *. Es ist wie der Versuch, in Ihrem Dienst auf $ scope zuzugreifen, eckig 1 würde Sie anschreien. Also, warum willst du einen Nav-Controller in deinem Dienst? – Rexford

+0

Ich verstehe, was Sie sagen, aber es ist eine andere Ebene der Abstraktion, die so aussieht, als sollte es funktionieren. – jaruesink

7

Verwendung getActiveNav().

import {App} from 'ionic-angular'; 
... 
constructor(private app: App) {} 
... 
let nav = this.app.getActiveNav(); 
nav.push(LoginPage); 
+2

Bitte entfernen Sie diese Antwort, da es ab Beta 7 nicht mehr möglich ist. – user1928596

+1

@ user1928596 falsch, es ist immer noch da: https://github.com/driftyco/ionic/blob/2.0/src/components/app/app .ts # L93 – nunoarruda

+1

Es gibt keine IonicApp mehr, du solltest die App korrigieren, und deine Antwort hat mir gestern geholfen, also gehst du, wenn es behoben ist :) – user1928596