Angular 2 - FormGroup ValueChanges 取消订阅

2024-03-19

我有一个带有 ValueChanges 事件的 FormGroup,当用户从组件的路由移动到另一个组件然后返回到该组件时,该事件不会从内存中释放。

这意味着,如果用户离开组件然后返回组件 5 次,则 onFormChange 方法会触发 5 次,但其中只有 1 次是针对当前组件的。

我认为问题是我需要取消订阅 NgDestroy 事件中的 valueChanges 事件,但 valueChanges 事件上没有可用的取消订阅方法。

我确信我必须取消订阅或释放某些内容的内存,但我不确定是什么。

import * as _ from 'lodash';
import {Observable} from 'rxjs/Rx';

import {Component, Input, Output, EventEmitter, OnInit, OnDestroy} from '@angular/core';
import {FormGroup} from '@angular/forms';

import {formConfig} from './toolbar.form-config';
import {JobToolbarVm} from '../view-model/job-toolbar.vm';
import {BroadcastService} from '../../../services/broadcast/broadcast.service';

@Component({
    selector: 'wk-job-toolbar',
    template: require('./toolbar.html'),
})
export class JobToolbarComponent implements OnInit, OnDestroy {

  protected form: FormGroup;

  @Input()
  toolbar: JobToolbarVm;

  @Output()
  toolbarChanged = new EventEmitter<JobToolbarVm>();

  @Output()
  refresh = new EventEmitter<string>();

  constructor(private broadcast: BroadcastService) {
  }

  ngOnInit() {

    this.form = formConfig;
    this.form.setValue(this.toolbar, {onlySelf: true});

    // This ALWAYS RUNS when the form loads, ie. on the job route
    console.log('FORM VALUE');
    console.log(JSON.stringify(this.form.value, null, 2));

    this.form.valueChanges
      .debounceTime(2000)
      .subscribe(
        this.onFormChange.bind(this)
      );
  }

  ngOnDestroy() {
    //this.form.valueChanges.unsubscribe();
    //this.onChanges.unsubscribe();
    //this.toolbarChanged.unsubscribe();
    //this.form = null;
  }

  onFormChange(data: any) {
    // This runs whenever I go to a different route and then come back to this route
    // There is also a memory leak, because this method fires multiple times based on how
    // often I navigate away and come back to this route.
    // e.g. Navigate away and then back 5 times, then I see this log statement 5 times 
    console.log('FORM VALUE2 - THIS KEEPS FIRING FOR EACH INSTANCE OF MY COMPOMENT');
    console.log(JSON.stringify(this.form.value, null, 2));

    JobToolbarVm.fromJsonIntoInstance(data, this.toolbar);

    this.onChanges('data-changed');
  }

  onChanges($event: any) {
    console.log('onChanges: ' + $event);
    // console.log(this.toolbar);

    // Send the toolbar object back out to the parent
    this.toolbarChanged.emit(this.toolbar);

    // Broadcast an event that will be listened to by the list component so that it knows when to refresh the list
    this.broadcast.broadcast('job-admin-toolbar-changed', this.toolbar);
  }
}

The subscribe()调用返回一个Subscription这就是您用来取消订阅的方法:

class JobToolbarComponent

  private subscr:Subscription;

  ngOnInit() {
    ...
    this.subscr = this.form.valueChanges ...
    ...
  }

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

Angular 2 - FormGroup ValueChanges 取消订阅 的相关文章

随机推荐

  • 在 require.js AMD 中添加 Mustache Temple 到 require

    在 js 中 您可以在定义模块时在 require 部分加载 html 模板 例如 模板文件 test html 在模块中 define template test function rest of code 但这会在获取文件名附加的文件时
  • python 打印一行相同的空格

    我需要在同一个地方打印 确定 有什么办法可以做到吗 我找到了解决方案 但它们不能正确地与 IDLE 配合使用 while count lt 9 if statusm
  • phpmyadmin 和外键

    我向我的字段之一添加了外键约束 插入时 该字段显示为下拉菜单而不是预期的文本框 但下拉菜单中的每个值都会列出两次 一次在值之前有一个减号 一次在值之后有一个减号 像这样 value1 value2 value3 value1 value2
  • 如何将 .pb 转换为 TFLite 格式?

    我下载了一个retrained graph pb and retrained labels txt我在 Azure 认知服务中训练的模型的文件 现在我想使用该模型制作一个 Android 应用程序 为此我必须将其转换为 TFLite 格式
  • 在渲染服务器端之前获取数据

    现在我正在发现Este js我对同构应用程序有一个小问题 我不明白如何在使用 renderToString 渲染服务器端之前进行 api 调用 一种解决方案是使用 React Router 在路由器级别获取所有数据 根据顶层路由 我可以预测
  • 在 MatSnackBar 中使用“snackBar.openFromComponent()”方法时如何放置操作按钮?

    我使用 MatSnackBar 进行通知 并且希望在小吃栏中有一个操作按钮 使用时如何插入 snackBar openFromComponent method Here is my code https stackblitz com edi
  • Facebook API 用于读取已添加书签的项目

    Facebook 最近添加了一项新功能 允许为有趣的链接添加书签以供以后阅读 保存的链接可在 保存 选项卡中找到 是否有任何 Facebook API 例如 Graph API 用于检索这些保存的项目 用于访问 Facebook 已保存链接
  • 如何进行全局字符串替换而不需要转义所有内容?

    我想用另一个字符串替换字符串中出现的所有模式 例如 让我们将所有 转换为 gt 纯 string replace 仅替换第一个匹配项 replace gives 正则表达式迫使我转义为特殊字符 replace g Pattern is no
  • 如何格式化 Multimarkdown 表格?

    我正在按照以下表格部分下的指南编写 Multimarkdown 表格语法指南 http fletcherpenney net multimarkdown users guide multimarkdown syntax guide 我希望使
  • 将根据数量复制记录的查询

    我正在使用 SQL Server 2008 并寻找一个将根据数量复制记录的查询 表具有 QTY 和 PartNumber 列 需要为每个数量添加一条附加记录 假设零件编号的数量为 3 我需要包含该零件编号的三行 任何帮助将不胜感激 谢谢 测
  • 如何删除注册表中损坏的符号链接

    我正在对注册表进行一些编辑原型 以创建从一个区域到另一个区域的符号链接 我使用了以下代码 HKEY hkFS HKEY hkSOFTWARE DWORD dwDisposition LSTATUS result result RegOpen
  • 比较函数指针

    如何比较 C 中的函数指针 稳定吗 例如 这样的事情是否有效 if pFnc myFnc Do something C 03 5 10 1 expr eq 等于 和 不等于 运算符具有相同的作用 语义限制 转换和结果类型作为关系 运算符 但
  • postgresSQL中NOT IN和NOT EXISTS的区别

    Here s my table 当我使用 NOT IN 执行以下查询时 它给出了 namal 和 Ann SELECT firstname FROM info student info WHERE firstname NOT IN SELE
  • ClickOnce 或 InstallShield 能否安装 SQL Server 或 SQL Server Express?

    可以 ClickOnce 或 InstallShield 设置或配置 SQL Server 或 SQL Server Express 专门添加sa密码 启用命名管道 授予从文件夹读取的权限 添加主数据库 mdf我的客户端应用程序所需的文件
  • Swift SpriteKit SKSpriteNode 的“有时”不出现

    我正在使用 Swift 和 SpriteKit 制作 iOS 但是 我的应用程序运行时遇到不规则现象 有时船舶 SKSpriteNodes 不会出现在屏幕上 有时子弹的 SKSpriteNodes 不会出现 有时一切都显示良好 我将子弹添加
  • AlertDialog 中的资源 ID #0x0

    我添加一个AlertDialog在 kotlin 文件中 但出现异常 btnLogin setOnClickListener view gt login fun login val builder AlertDialog Builder t
  • 如何对整数字符串进行排序?

    我在对具有整数值的字符串列表进行排序时遇到一个奇怪的问题 然而 某些值可以以某些字符作为前缀 e g B1 5 50 A10 7 72 B3 A1 A2 基本上有页码 应该按如下方式排序 A1 A2 A10 B1 B3 5 7 50 72
  • 我们可以让聊天机器人先说问候语,而不仅仅是作为反应吗

    我正在使用 Microsoftt Bot Framework 和 LUIS 认知服务开发聊天机器人 我想要一条初始欢迎消息 例如 你好 用户 你好吗 我的机器人一启动 在 MessageController 中可以做任何事情 public
  • 在 gitlab-ci.yml 上动态设置工件路径/文件夹结构

    我有以下内容gitlab ci yml读取的文件package json使用jq https stedolan github io jq 处理器动态设置工件文件夹的变量名称 类似于 image node latest stages buil
  • Angular 2 - FormGroup ValueChanges 取消订阅

    我有一个带有 ValueChanges 事件的 FormGroup 当用户从组件的路由移动到另一个组件然后返回到该组件时 该事件不会从内存中释放 这意味着 如果用户离开组件然后返回组件 5 次 则 onFormChange 方法会触发 5