Angular 4 Subscribe方法多次调用

2024-06-25

我正在创建一个全局模态组件。 我的问题是,当我调用 subscribe 方法时,它会根据调用的模态数量多次调用。 如何防止对可观察订阅方法的多次调用?请检查下面我的代码。提前致谢。

模态.model.ts

export class Modal {
  title: string;
  message: string;
  visible: boolean = false;
}

模态服务

import { Injectable } from '@angular/core';
import { Modal } from './modal.model';
import { Observable } from 'rxjs';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class ModalService {
  static readonly YES = 1;
  static readonly NO = 0;

  private modal = new Modal();
  private subject = new Subject<Modal>();
  private action = new Subject<number>();

  confirmationDialog(message) {
    this.modal.title = 'Confirmation';
    this.modal.message = message;
    return this;
  }

  show() {
    this.modal.visible = true;
    this.setModal(this.modal);
    return this;
  }

  setAction(action: number) {
    this.action.next(<number>action);
  }

  getAction(): Observable<any> {
    return this.action.asObservable();
  }

  setModal(alert: Modal) {
    this.subject.next(<Modal>alert);
    return this;
  }

  getModal(): Observable<any> {
    return this.subject.asObservable();
  }
}

模态组件

import { Component, OnInit } from '@angular/core';
import { ModalService } from './modal.service';
import { Modal } from './modal.model';

@Component({
  selector: 'modal',
  templateUrl: './modal.component.html',
  styleUrls: ['./modal.component.css']
})
export class ModalComponent implements OnInit {
  public modal: Modal;

  constructor(private modalService: ModalService){}

  ngOnInit() {
    this.modalService.getModal().subscribe((modal: Modal) => {
      this.modal = modal;
      console.log(modal);
    });
  }

  no() {
    this.modalService.setAction(0);
    this.modalService.close();
  }

  yes() {
    this.modalService.setAction(1);
    this.modalService.close();
  }
}

调用模态组件

showModal() {
  this.modalService.confirmationDialog('Are you sure you want to save this record?').show();
  this.modalService.getAction().subscribe(response => {
    if(response === ModalService.NO) {
      return;
    }
    console.log('call mutiple times');
  });
}

这是控制台日志上的输出屏幕截图。控制台日志输出 https://i.stack.imgur.com/ZT2kb.png


我想我会更容易使用async模态组件内的管道:

import { Component } from '@angular/core';
import { Observable } from 'rxjs';

import { ModalService } from './modal.service';
import { Modal } from './modal.model';

@Component({
  selector: 'modal',
  templateUrl: './modal.component.html',
  styleUrls: ['./modal.component.css']
})
export class ModalComponent {
  public modal$: Observable<Modal>;

  constructor(private modalService: ModalService){
      this.modal$ = this.modalService.getModal();
  }

  no() {
    this.modalService.setAction(0);
    this.modalService.close();
  }

  yes() {
    this.modalService.setAction(1);
    this.modalService.close();
  }
}

在你的模板中,例如:

(modal$ | async)?.title

这确保了 Angular 在组件销毁时自行清理订阅。

对于创建模式时的订阅,您可以使用take运算符,如果发出 x 值,则完成订阅。

this.modalService.getAction().take(1).subscribe(response => {
    if(response === ModalService.NO) {
      return;
    }
    console.log('call mutiple times');
});

我假设您只需要 1 个值(因为它是一个简单的对话框)。

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

Angular 4 Subscribe方法多次调用 的相关文章

随机推荐

  • 正则表达式 在 Coldfusion 中匹配整个单词字符串

    我正在尝试这个例子 第一个例子 keyword star myString The dog sniffed at the star fish and growled regEx b keyword b if reFindNoCase reg
  • 特殊字符(-&+ 等)在 SOLR 查询中不起作用

    我正在使用 text general fieldType 在 SOLR 中进行搜索 在使用特殊字符进行搜索时 我没有得到正确的结果并出现错误 我想使用这样的特殊字符 Query solr q Healing Live solr q Heal
  • 符号问题 - 无法进入 .NET 代码

    我无法使 Visual Studio 2010 SP1 进入任何 NET Framework 类 我在互联网上找到了很多指南 但没有一个有效 这是输出窗口的内容 Step into Stepping over method without
  • 如何在 log4net 附加程序名称中使用 GlobalContext 属性?

    我正在尝试自定义 log4net 文件路径以使用我在log4net GlobalContext Properties字典 log4net GlobalContext Properties LogPathModifier SomeValue
  • Rails 可安装引擎的 prepend_view_path

    一方面 我有一个可安装的发动机 比如说前轮 前面包含我的资产和几页 它与 MainApp 隔离 我不想让它触及主应用程序 另一方面 我希望我的 MainApp 使用布局和部分前端 所以我这样设置布局 class ApplicationCon
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • Java 中 Math.floorDiv 的 ceil 对应部分?

    有没有ceil对应的Math floorDiv http docs oracle com javase 8 docs api java lang Math html floorDiv long long 如何用我们现有的最快方法计算它 UP
  • RcppArmadillo 传递用户定义函数

    考虑以下 R 代码 R version caller lt function x 1 3 fun identity do some other stuff then call the function eval call fun x fun
  • 将数据添加到数据库(相关表)Spring Boot

    我英语很差 但我正在尝试描述我的问题 我是春天的新人 我在向数据库添加数据时遇到一些问题 我必须表 PC 和 PC 特征 它们通过 Id 关联 在非关联表中添加数据很容易 但是如何在关联表中添加数据呢 我应该在控制器中写什么 下面有一些类
  • 您可以将 Apple 的 Mapkit 用于混合应用程序吗?

    此 Web 应用程序适用于 Web 和 Android 我研究了谷歌等其他公司 但他们也有局限性 如果您可以使用它 任何人都可以向我指出它的文档 Thanks 2019年更新 Apple 现在拥有用于在网络上使用 Apple 地图的第一方
  • 菜单中的图标比应有的小

    SOLVED 我使用的是 sdk v9 Android 2 3 Gingerbread 中的图标 它似乎有不同的尺寸 asset studio 还为 2 3 创建了图标 因此 我将姜饼图标放置到了drawable xxpi v9中 对于旧版
  • 扫描仪未读取整个句子

    扫描仪未读取整个句子 或者假设我正在编写一种方法 可以颠倒句子中的单词 同时保持它们在句子中的顺序 public static String reverse String s String revStr for int a s length
  • 将纬度/经度转换为像素并返回

    我在我的应用程序中使用谷歌地图 并且我有一个网络服务器 其中的数据库填充了纬度 经度值 我想在地图上标记它们 但如果它们彼此之间在一定的像素距离内 我也想将它们聚集在一起 我想如果我从数据库中检索所有的点 我应该能够做这样的事情 伪代码 c
  • 使用 python datetime 从星期几和日期推断年份

    我有以下形式的数据Thu Jun 22 09 43 06我想从中推断出年份以供使用datetime计算两个日期之间的时间 有没有办法使用datetime根据上述数据推断年份 不 但如果您知道范围 例如 2010 2017 您可以迭代多年 看
  • 使用 jQuery 导入 XML:在服务器上运行,而不是在本地运行

    我正在编写一个读取 XML 文件然后输出数据的脚本 当它在我的网络服务器上运行时它可以完美地工作 但不能从我的本地计算机上运行 542Data xml 文件与服务器和我的计算机上的HTML页面存储在同一文件夹中 我检查了所有文件版本是否相同
  • 当我运行 rake:db migrate 命令时,出现错误“未初始化常量 CreateArticles”

    我创建了一个模型 ruby 脚本 生成模型文章 简单就够了 这是迁移文件create articles rb def self up create table articles do t t column user id integer t
  • DataGrid 是 WPF 中的必需品吗?

    我看到很多讨论正在进行 人们询问 WPF 的 DataGrid 并抱怨 Microsoft 迄今为止还没有在其 WPF 框架中提供 DataGrid 我们知道 WPF 是一项出色的 UI 技术 并且具有 ItemsControl DataT
  • getActivity() 与 FragmentActivity: android

    我正在使用这个类 A 它扩展了另一个抽象类 并且这个抽象类扩展了 FragmentActivity 并且在 A 类中的一个函数中 我想为我当前的活动 A 获取 getActivity 但是每当我使用 getActivity 时 它都会给出我
  • 在Service中使用Looper和使用单独的线程是一样的吗?

    在此示例中 来自文档 https developer android com guide components services html ExtendingService https developer android com guide
  • Angular 4 Subscribe方法多次调用

    我正在创建一个全局模态组件 我的问题是 当我调用 subscribe 方法时 它会根据调用的模态数量多次调用 如何防止对可观察订阅方法的多次调用 请检查下面我的代码 提前致谢 模态 model ts export class Modal t