【问题标题】:Ionic2: Can't use NavController in a Service. [duplicate]Ionic2:不能在服务中使用 NavController。 [复制]
【发布时间】:2018-03-15 15:54:27
【问题描述】:

我还是个学习者。不仅在 Ionic 中,在 Angular 中也是如此。

我已经编写了一些页面,并希望在每个页面中添加一个页脚,以便用户可以在所有主页之间进行切换。在写完第 2 页后,我发现如果有这样的服务会很好,因为我再次使用了相同的方法。

这是我的服务现在的样子:

export class Navigation {
  public navCtrl: NavController;

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

当我现在在 HTML 模板中调用 Navigator.onLoadHome() 时,出现以下错误: 无法读取未定义的属性“推送”。

所以我知道我的应用找到了服务并找到了方法。但是我的 navCtrl 是未定义的。我通过执行以下操作尝试了另一种方法:

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

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

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

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

(顺便说一句。我已经稍微缩短了类。但是其他方法与 onLoadHome 一样,仅适用于其他页面。)

【问题讨论】:

  • 发布NavController
  • NavController 应该只注入到页面/组件中。在服务中操作导航堆栈通常不是一个好主意
  • 你可以将NavController对象传递给onLoadHome()这样的函数onLoadHome(navCtrl: NavController)

标签: angular service ionic2 undefined


【解决方案1】:

这不是在页面之间导航的好方法,但我希望这可能对您有所帮助

在你想使用服务的页面,你必须导入服务然后这样设置

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();
  }

【讨论】:

  • 我试过这个,但我仍然收到运行时错误:“无法解析导航的所有参数”。顺便问一下,为什么它不是在页面之间导航的好方法?
  • "从服务更改视图是不好的做法(损坏的 MVC)。但是,您可以将事件从服务发送到主控制器,并且控制器可以使用 NavController(最佳方式),或者您可以像属性一样将 NavController 发送到您的服务(不错的方式...)。或者您可能需要创建一个组件而不是使用该服务。”我只是添加了另一种方式,你应该尝试
  • 首先,您的第二个示例运行良好!谢谢你。 :) 根据您的建议。这意味着我应该编写一个导航组件。在这一个中,我应该写下所有方法,然后我可以将此组件用作每个页面的新页脚。我没听错吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 2018-05-18
  • 1970-01-01
  • 2017-06-08
  • 2017-02-05
  • 2018-01-18
  • 1970-01-01
  • 2017-03-20
相关资源
最近更新 更多