【问题标题】:Ionic events not working correctly between lazy-loaded modules延迟加载模块之间的离子事件无法正常工作
【发布时间】:2018-02-21 03:47:47
【问题描述】:

我创建了一个具有基本延迟加载实现的离子应用程序。假设为了一个例子,我的应用包含 2 个 lazy-loaded 页面,Page1 & Page2

所以在 page1.ts 的构造函数中,我发布了一个名为 hello 的事件,并且在 的构造函数中>page2.ts,我已经订阅了那个特定的活动。

我的应用以 Page1 开头。

但是在运行应用程序后,我发现我的事件没有被订阅直接从Page1的构造函数发布事件hello。你能帮我解决这个问题吗,为什么我的订阅方法(在Page2 构造函数中)没有监听来自Page1 的已发布事件。

示例代码:

page1.ts(应用以此开头)

constructor(public events: Events) {
    this.events.publish('hello', 'some data');
    console.log('Published');
}

page2.ts

constructor(public events: Events) {
    this.events.subscribe('hello', (data) => {
        // This isn't working in case of lazy-loading
        console.log('subscribed to hello with data', data);
    });
}

我的应用程序启动后,只有Published 会登录控制台。之后什么也没有发生。但根据我对离子事件的理解,Page2 的订阅方法在该事件发布后也应该可以工作。不是吗?请帮我解决这个问题。

【问题讨论】:

    标签: angular ionic-framework events ionic3 dom-events


    【解决方案1】:

    您的 Page2 已延迟加载,因此尚未创建。

    Ionic Events 会为您发布的每个事件创建一个列表。其中包含一个回调列表,您在订阅该事件时会添加回调函数。当事件发布时,列表中的回调会被调用。

    当你在第1页发布时,如果你的第2页没有加载,回调将不会被调用,因为它当时不在列表中。

    【讨论】:

    • 是的,谢谢你的回答,我也只是想这个。那么,您的意思是在延迟加载的实现中不可能完成我正在尝试做的任务吗?有什么办法可以让我在不删除延迟加载的情况下实现这一目标?
    • 取决于您想在订阅的 page2 组件中执行的操作。您可以在单例提供程序中订阅
    • 好的,单身人士会为我做这件事。谢谢您的帮助!但是 ionic 或 angular 的依赖项 @Injector 是否支持单例初始化?
    • 是的,但在你的情况下不是。如果您将它包含在主应用程序模块中并且不要延迟加载内容。如果你从一个延迟加载的页面注入一些东西,它不会是一个单例,因为延迟加载会启动它自己独立的依赖注入器。是的,我知道 :( 你可能想维护一个常规类 Globals 并在那里管理状态。当你延迟加载页面时,检查状态。要管理全局,订阅核心模块级别的东西。
    • @DmitriR117 感谢您的回复。您能否在某处给我看一些例子,以便我能更好地理解您所说的方式!
    【解决方案2】:

    您必须在您的活动发布之前运行subscribe 方法。
    这就像一个电视节目。订户是您的电视。出版商是节目。您需要在演出前打开电视,否则您会错过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2021-04-03
      • 1970-01-01
      相关资源
      最近更新 更多