如何将数据传回 Ionic 2 中的根页面?

2024-04-17

我有一个 Ionic 2 应用程序。该应用程序的前提是上课。一旦课程被打开,用户就会被标记为在远程 API 中学习该课程。

数据流向为:

  1. 用户打开“课程”选项卡。
  2. 应用程序从 API 请求“类”数据。每个类别都拥有该用户的“状态”。
  3. 用户选择一个类别。这将在应用程序中打开一个新视图,使用NavController.push(Page, { 'classes': classObjFromApi });.
  4. 堆栈中添加了一些页面,每个页面都有classes对象传递给它。
  5. 在最后一页上,API 被告知当前类已被采用,用户可以使用以下命令导航回根目录:NavController.popToRoot()

在根页面上显示每个课程的状态(“未开始”、“进行中”、“已完成”)。在上述流程中的第 5 点,用户被带回根目录,但这具有最初构建时的数据,该数据将类显示为“未开始”,即使它现在“已完成”。

如何从堆栈中的不同页面更新根页面上的数据?我原以为popToRoot()会接受navParams因此我可以检查根页面中是否存在该数据,如果存在则使用它,如果不存在则从 API 请求。

我可以通过从 API 重新请求数据来解决这个问题ionViewDidEnter方法,但这意味着每次用户查看此页面时都会发出 API/HTTP 请求,即使应用程序具有数据。看起来很乱。

如果可以的话,我宁愿不使用内部存储,因为它会在加载页面时产生延迟,因为我必须等待从存储中提取数据才能显示它。

所以我的问题是:这样做的最佳方法是什么?如果要将数据传递给视图,我该怎么做popToRoot()不支持导航参数?


最好的方法是使用Events https://ionicframework.com/docs/api/util/Events/:

在根页面中,订阅自定义事件,以便在每次发布该事件时执行一些代码:

import { Events } from 'ionic-angular';

constructor(public events: Events) {
  events.subscribe('status:updated', (updatedData) => {
    // You can use the updatedData to update the view
    // ...
  });
}

// Clean up the subscription when the page is about to be destroyed
ionViewWillUnload() {
  this.events.unsubscribe('status:updated');
}

当用户更改该数据时,在任何其他页面中发布该事件:

import { Events } from 'ionic-angular';

constructor(public events: Events) {}

yourMethod(): void {
  // Your custom logic...
  // ...

  // Now you can publish the event to update the root page (and any other page subscribed to this event)
  this.events.publish('status:updated', updatedData);
}

EDIT

另一种方法是使用共享服务,并使用Subject发布/订阅更改。结果将非常类似于离子事件,但在这种情况下,您需要添加共享服务,然后在数据更新时使用它。我更喜欢 Ionic Events,但为了以防万一,您可以这样做:

import { Subject } from 'rxjs/Subject';

@Injectable()
export class MySharedService {
  public onDataChange: Subject<any>;

  constructor() {
    this.onDataChange = new Subject<any>();
  }

  public publishUpdate(newData): void {
    // Send the data to all the subscribers
    this.onDataChange.next(newData);
  } 
}

现在在您的根页面中,使用共享服务订阅更改

import { Subscription } from 'rxjs/Subscription';

// ...

private onDataChangeSubscription: Subscription;

constructor(public mySharedService: MySharedService) {
  this.onDataChangeSubscription = mySharedService.onDataChange.subscribe(
    updatedData => {
      // You can use the updatedData to update the view
      // ...
    });
}

// Clean up the subscription when the page is about to be destroyed
ionViewWillUnload() {
  this.onDataChangeSubscription.unsubscribe();
}

从任何其他页面更新数据时,您也需要使用共享服务:

constructor(public mySharedService: MySharedService) {}

yourMethod(): void {
  // Your custom logic...
  // ...

  // Now you can publish the event to update the root page (and any other page subscribed to this event)
  this.mySharedService.publishUpdate(updatedData);
}

如果您需要在每次更新数据时执行一些自定义逻辑,那么这种方法可能会更好,因此您可以在共享服务中执行此操作,然后广播结果,而不是在每个订阅者上执行此操作...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将数据传回 Ionic 2 中的根页面? 的相关文章

随机推荐

  • 如何在另一个文件的函数中使用一个 PHP 文件中的变量?

    注意 到目前为止 我已经阅读了大约 25 个与此相关的问题 但从未直接回答 如何正确使用这些变量 的问题 如果听起来像是重复的 我深表歉意 我正在重写一个扁平化电商网站 全手工制作 htm文件 以便某些页面是使用 PHP 脚本生成的 这一切
  • 如何将字符串分割成等长的子串?

    我正在寻找一个elegant way in Scala http www scala lang org 将给定字符串拆分为固定大小的子字符串 序列中的最后一个字符串可能更短 So split Thequickbrownfoxjumps 4
  • StreamWriter.Write 不写入文件;没有抛出异常

    我的 C 代码 asp net MVC StreamWriter tw new StreamWriter C mycode myapp logs log txt write a line of text to the file tw Wri
  • 框架和对象之间有什么区别,什么时候应该修改其中一个而不是另一个?

    我开始阅读有关 python 的 语法的内容 并偶然发现了以下帖子 答案 关于 的交互代码 https stackoverflow com a 13329969 7143036 所以我注意到框架和物体之间似乎存在差异 在全局框架中 即使它们
  • JMS消息监听器Weblogic的并发处理

    我正在 JMS 上运行测试用例 发现处理是顺序的 当我向使用 JMS 发送消息的 servlet 发出 200 个请求时 接收器 messageListner 正在按顺序接收请求 如何接收并发请求 我们有什么参数要设置吗 我阅读了 JMS
  • 警告:尝试多次加载角度。角JS

    我试图在运行 Grunt Build 后查看我的应用程序 我使用 gruntserve dist 来查看所有生产就绪的构建 但在浏览器中我得到一个无限循环 警告 尝试多次加载角度 我读到发生这种情况是因为 TemplateURL 连接后可能
  • 警告:非法字符串偏移“名称”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试制作一个产品插入页面 以便我可以将产品插入数据库 然后将它们显示在产品页面中 但是当我单击 添加产品 按钮时 出现以下错
  • pandas 数据框中的圆形浮点列

    我有以下熊猫数据框 Y X id WP NER 0 35 973496 2 734554 1 WP 01 1 35 592138 2 903913 2 WP 02 2 35 329853 3 391070 3 WP 03 3 35 3926
  • C#6 中的长字符串插值行不支持 Tab、CR 和 LF

    我尝试在 C 6 中使用制表符进行字符串插值 var name My Name var text t t name 它工作正常 制表符 t 已解决 当尝试使用时长字符串插值线 https stackoverflow com question
  • 具有数据属性的 JQuery UI 工具提示

    我正在尝试使用 HTML5 数据属性来存储和显示工具提示的内容 我使用 JQuery UI 作为工具提示 我已阅读文档 但尚未弄清楚如何对正确的选择器进行编程并显示自定义数据 对我所缺少的有什么想法吗 http jsfiddle net Q
  • 如何在 Symfony2 控制器中获取用户 IP 地址?

    我需要在提交表单后将评论用户的 IP 地址存储在数据库中 symfony2有没有获取IP的函数 或者有其他方法获取IP吗 您可以使用 Request 服务获取客户端 IP container gt get request gt getCli
  • 如何在开始日期的时间戳中添加秒数,以便获得估计的结束日期?

    我有一个带有 start time 和估计时间 以秒为单位 的任务对象 start time 以 MYSQL DATETIME 形式存储在数据库中 估计时间以秒形式存储 我想将秒数添加到 start time 以获得估计的完成日期 内维尔提
  • 安全地存储访问令牌

    我应该采取哪些安全措施来确保 如果我的数据库受到损害 长寿命访问令牌不会被盗 长寿命访问令牌与特定服务的用户名和密码一样好 但从与其他人的交谈看来 大多数人 包括我自己 都以纯文本形式存储访问令牌 这似乎与以纯文本形式存储密码一样糟糕 显然
  • 我的 QFileSystemModel 在 PyQt 中无法按预期工作

    EDIT2 model hasChildren parentIndex 回报True but model rowCount parentIndex 回报0 QFileSystemModel 只是 PyQt 中的 fubar 吗 EDIT 经
  • 使用 MQL5 将 OHLC 值从 Python API 集成到 MT5

    我已经从 iqoption 获得了 OHLC 值 并试图找到一种将其与 MT5 一起使用的方法 这是我获取这些值的方法 import time from iqoptionapi stable api import IQ Option I w
  • SSRS 可以根据导出类型切换标题可见性吗? 2008-R2

    我熟悉基于变量或参数值动态显示 隐藏其他报表对象 文本框 tablix 列等 但有没有办法用标题来做到这一点 我在标题对象上没有看到任何 可见性 选项卡来设置表达式 此外 有没有办法根据导出样式隐藏标题 例如 我想在导出到 PDF 时显示标
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • 使用 CSS Mix-Blend-Modes 进行隔离:如何防止元素与父元素混合

    我已经尝试了很多不同的方法 但无法使 pink 和 green div 相互混合 但不能使父元素 wrapper 的背景颜色混合 wrapper background color blue height 100vh width 100 is
  • Python中的三角波形状数组

    生成 100 个数字组成的数组 形成下面三角波的形状 最大 最小幅度为 0 5 的最有效方法是什么 记住三角波形 生成三角波的最简单方法是使用 signal sawtooth 请注意 signal sawtooth phi width 接受
  • 如何将数据传回 Ionic 2 中的根页面?

    我有一个 Ionic 2 应用程序 该应用程序的前提是上课 一旦课程被打开 用户就会被标记为在远程 API 中学习该课程 数据流向为 用户打开 课程 选项卡 应用程序从 API 请求 类 数据 每个类别都拥有该用户的 状态 用户选择一个类别