0

0

从异步数据流中计算并显示总计

DDD

DDD

发布时间:2025-11-01 10:34:14

|

237人浏览过

|

来源于php中文网

原创

从异步数据流中计算并显示总计

本教程详细阐述了如何在angular/ionic应用中,从observable数据源(如sqlite数据库)获取并显示列表项,并计算这些项的总计。通过订阅数据流并在组件中利用`array.prototype.reduce()`方法聚合数据,最终在html模板中展示计算结果。文章涵盖了实现代码、原理分析以及性能考量,旨在提供一个清晰、专业的解决方案。

在现代Web应用开发中,尤其是在使用Angular和Ionic框架构建的移动或Web应用中,从后端服务或本地数据库获取数据并以列表形式展示是常见需求。当这些列表项包含数值信息(如价格、数量、小计)时,往往需要计算并显示这些项的总计。本教程将指导您如何在数据源为Observable类型时,有效地实现这一功能。

理解数据源与挑战

在Angular中,数据通常通过Observable(可观察对象)来管理异步操作,例如从SQLite数据库获取数据。当您使用*ngFor指令遍历一个Observable类型的数据时,Angular的async管道会自动订阅并处理数据流。然而,要计算这些数据的总计,您需要访问到实际的数据数组,而不仅仅是Observable本身。

给定的场景中,我们有一个products: Observable,它包含每个产品的名称、价格、数量和总价。目标是在列表底部显示所有产品的“总金额”和“总计”。

原始的HTML结构展示了产品列表和预留的总计区域:


  
    Name
    Price
    Amount
    Total
  

  
     {{ prod.name }} 
     {{ prod.price }} 
     {{ prod.amount }} 
     {{ prod.total }} 
  

  
    
    
    grand amount total
    grand total
  

实现总计计算逻辑

为了计算总计,我们需要在组件中创建一个方法,该方法能够订阅products Observable,获取到实际的产品数组,然后遍历数组并累加每个产品的total属性。

组件逻辑 (.ts 文件)

在您的组件类(例如 ReportPage)中,添加一个方法来执行总计计算。由于 this.products 是一个 Observable,我们必须订阅它才能访问其内部的数据。

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { DatabaseService } from '../services/database.service'; // 假设您的服务路径

export class ReportPage implements OnInit {

  products: Observable;
  product = {}; // 示例中未使用的变量,可根据实际情况移除

  constructor(public db: DatabaseService) {}

  ngOnInit() {
    this.db.getDatabaseState().subscribe((rdy) => {
      if (rdy) {
        // ... 其他初始化逻辑 ...
        this.products = this.db.getProducts(); // 获取产品数据Observable
        // ... 其他初始化逻辑 ...
      }
    });
  }

  /**
   * 计算所有产品的总计。
   * 注意:此方法每次被调用时都会订阅products Observable。
   * 对于大型数据集或频繁调用,可能需要考虑性能优化。
   * @returns 所有产品total字段的总和。
   */
  calculateGrandTotal(): number {
    let totalAll = 0;
    // 订阅products Observable以获取实际数据数组
    this.products.subscribe((data) => {
      // 使用reduce方法累加每个产品的total字段
      totalAll = data.reduce((sum, current) => sum + current.total, 0);
    });
    return totalAll;
  }
}

代码解析:

  1. calculateGrandTotal(): number: 这是一个返回数字类型的方法,用于计算总计。
  2. this.products.subscribe((data) => { ... }): 这是核心部分。由于 products 是一个 Observable,您需要订阅它才能接收到它发出的数据。当数据可用时,subscribe 回调函数中的 data 参数将包含实际的产品数组 (any[])。
  3. data.reduce((sum, current) => sum + current.total, 0): Array.prototype.reduce() 方法用于将数组中的所有元素聚合为单个值。
    • sum: 累加器,存储当前的总和。
    • current: 当前正在处理的数组元素(即一个产品对象)。
    • sum + current.total: 将当前产品的 total 值加到累加器上。
    • 0: reduce 方法的初始值,确保从0开始累加。

模板集成 (.html 文件)

现在,您可以在HTML模板中调用 calculateGrandTotal() 方法来显示总计。


  

  
    
    
    grand amount total
    
      {{ calculateGrandTotal() }}
    
  

将 {{ calculateGrandTotal() }} 放置在您希望显示总计的 ion-col 元素中。Angular的数据绑定机制会在组件属性或方法发生变化时自动更新模板显示。

网店联盟商城
网店联盟商城

网店联盟商城3.2主要修改:1、前台公告显示改为在上面显示。2、前台图片显示不限制长宽3、后台增加统计信息4、修正部门程序BUG功能介绍1、 前台:1) 商品信息搜索2) 分类页面显示3) 首页最新浏览显示4) 网站留言显示5) 会员信息修改6) 会员订单显示7) 会员购物车显示8) 商品购买计算成交流程,并生成html订单。9) 关于我们、联系我们动态显示2、 后台:1) 基本信息查看:一些数据

下载

注意事项与最佳实践

  1. 订阅的性能考量: 在模板中直接调用一个会执行 subscribe 操作的方法 (calculateGrandTotal()),意味着每次Angular的变更检测循环运行时,该方法都可能被调用,从而导致对 products Observable 的重复订阅。对于静态数据或更新不频繁的数据,这可能不是大问题。但对于大型数据集或频繁更新的数据,这可能导致性能下降和不必要的计算。

  2. 优化策略:

    • 一次性计算并存储: 更好的做法是在 products Observable 发出数据后,立即计算总计并将其存储在一个组件属性中。例如:

      import { Component, OnInit, OnDestroy } from '@angular/core';
      import { Observable, Subscription } from 'rxjs';
      import { tap, map } from 'rxjs/operators';
      import { DatabaseService } from '../services/database.service';
      
      export class ReportPage implements OnInit, OnDestroy {
        products: Observable;
        grandTotal: number = 0;
        private productsSubscription: Subscription;
      
        constructor(public db: DatabaseService) {}
      
        ngOnInit() {
          this.db.getDatabaseState().subscribe((rdy) => {
            if (rdy) {
              this.products = this.db.getProducts().pipe(
                tap(data => {
                  // 在数据到达时计算总计并存储
                  this.grandTotal = data.reduce((sum, current) => sum + current.total, 0);
                })
              );
            }
          });
        }
      
        ngOnDestroy() {
          // 组件销毁时取消订阅,防止内存泄漏
          if (this.productsSubscription) {
            this.productsSubscription.unsubscribe();
          }
        }
      }

      然后在HTML中直接显示 {{ grandTotal }}。这种方法确保了总计只在数据更新时计算一次。

    • 使用 async 管道和 map 操作符: 如果您想在模板中保持简洁,并且数据流允许,可以使用 map 操作符在 Observable 内部计算总计,并创建一个新的 Observable 来专门提供总计。但这通常会使数据结构变得复杂,不如直接存储在一个属性中清晰。

  3. 错误处理: 在实际应用中,您应该为 Observable 的订阅添加错误处理逻辑,以应对数据获取失败的情况。

总结

通过在Angular/Ionic组件中订阅 Observable 数据源,并利用 Array.prototype.reduce() 方法,您可以有效地计算并显示列表项的总计。虽然直接在模板中调用订阅方法可以实现功能,但为了更好的性能和资源管理,建议在数据加载完成后将总计计算并存储在组件属性中。理解 Observable 的工作原理及其在Angular中的应用是构建响应式和高效应用的关键。

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

613

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

653

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

470

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2892

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

505

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

424

2023.09.01

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.7万人学习

CSS教程
CSS教程

共754课时 | 20.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号