Ionic2:不能在服务中使用NavController。

问题描述:

我还是个学习者。不仅在Ionic中,也在Angular中。Ionic2:不能在服务中使用NavController。

我已经写了一些页面,并希望为每个页面添加页脚,用户可以通过所有主页进行切换。在写完第二页之后,我发现为此提供服务会很好,因为我再次使用了相同的方法。

这里是我的服务看起来像现在:

export class Navigation { 
    public navCtrl: NavController; 

    onLoadHome(){ 
    this.navCtrl.push(HomePage); 
    } 
} 

当我现在请Navigator.onLoadHome()在一个HTML模板,我得到了以下错误: 无法读取属性的“推动”未定义。

所以我知道我的应用程序找到服务,并找到方法。但我的navCtrl是未定义的。我尝试了另外一种方法:

export class Navigation { 
    constructor(private navCtrl: NavController){} 

    onLoadHome(){ 
    this.navCtrl.push(HomePage); 
    } 
} 

现在我又收到一条错误消息:无法解析导航的所有参数。

我真的不知道该怎么做才能完成这项工作。我希望你能帮助我。

(顺便说一句,我已经缩短该类一点。但是其他的方法,像onLoadHome一样,只为其他页面。)

+0

发布'NavController' –

+0

['NavController'](https://ionicframework.com/docs/api/navigation/ NavController /)只能在页面/组件中注入。在服务中操作导航堆栈通常不是一个好主意 –

+0

您可以像这样的'onLoadHome(navCtrl:NavController)''将'NavController'对象传递给'onLoadHome()'函数。 – hrdkisback

这不是页面之间进行导航的好办法,但我希望这威力帮助你

在要使用本服务的页面,你得导入服务,然后将其设置这样

public mNavigation: Navigation; 

constructor(public navCtrl: NavController, public navParams: NavParams) { 
    this.mNavigation = new Navigation(navCtrl) 
} 

当你要浏览,只需调用this.mNavigation.onLoadHome();


更好的方法是,您应该在您的服务中使用AppNav而不是NavCtrl。它看起来像这样

import { App } from 'ionic-angular'; 

@Injectable() 
export class NavigationProvider { 

    constructor(public app: App) { 
    } 

    onLoadHome(){ 
    this.app.getActiveNav().push(HomePage); 
    } 
} 

那么你的页面会是这样

constructor(public navCtrl: NavController, 
    public mNavigationProvider: NavigationProvider, 
    public navParams: NavParams) { 
    } 

    onNavigate() {  
    this.mNavigationProvider.onLoadHome(); 
    } 
+0

我试过这一个,但我仍然得到一个运行时错误:'无法解析导航的所有参数'。顺便说一句,为什么它不是一个很好的方式来浏览页面? –

+0

“从服务中改变视图是不好的做法(中断的MVC),但是,您可以将事件从服务发送到主控制器,并且控制器可以使用NavController(最佳方式),或者可以将NavController发送到您的服务一个属性(不坏的方式......),或者你可能需要创建一个组件,而不是使用该服务。“ 我刚刚添加另一种方式,你应该尝试 –

+0

首先你的第二个例子完美地工作!谢谢你。 :) 给你的建议。这意味着我应该编写一个导航组件。在这一个,我应该写下所有的方法,然后我可以使用这个组件作为每个页面的新页脚。我对你有正确的理解吗? –