如何在 Angular 2 中观察全局服务器端变量的变化

分享于2023年06月29日 angular electron javascript node.js typescript 问答
【问题标题】:How to watch changes on a global server-side variable in Angular 2如何在 Angular 2 中观察全局服务器端变量的变化
【发布时间】:2023-06-15 01:26:01
【问题描述】:

我正在使用 Electron 和 Node 使用 Angular 2 创建一个应用程序。在服务器上运行一些测试,结果会一一输出到名为 testResults 的全局变量数组中。我可以使用以下方法将其拉入 Angular:

declare var testResults: any;

然而,当一个对象被添加到数组中时,我没有让 Angular 触发一个事件。有没有办法可以观察这个数组的变化?我试过 onChanges 和 doCheck 但没有运气。

这是我的组件:

import {Component, Input, OnChanges, SimpleChange, OnInit} from         'angular2/core';

declare var testResults: any;

@Component({
 selector: 'test-results',
 template: `{{ testResultsItem }}
 `,
})

export class TestResultsComponent implements OnChanges{
  @Input () testResultsItem = testResults;

ngOnChanges(changes: {[ propName: string]: SimpleChange}) {
    console.log('Change detected:', changes[this.testResultsItem].currentValue);
    console.log(this.testResultsItem);
 }
}

当我运行 setInterval 每秒在控制台中记录该数组时,我确实在控制台中看到了对数组的更改。它们还在 {{testResults}} 下的 DOM 中更新。但是应该有一种方法可以让 Angular 检测到这种变化,而不是运行 setInterval,对吗?任何帮助,将不胜感激!

这是我尝试使用 IterableDiffers 的时间:

import {Component, Input, OnChanges, SimpleChange, OnInit, IterableDiffers, ChangeDetectorRef, IterableDiffer, Directive, DoCheck} from 'angular2/core';

declare var testResults: any;

@Component({
selector: 'test-results',
template: `{{ testResultsItem | json }}
 `,
inputs: ['testResults']
 })

export class TestResultsComponent implements DoCheck{

private testResultsItem = testResults;
private differ:IterableDiffer;
constructor(private changeDetector:ChangeDetectorRef, private differs:IterableDiffers) {
 this.differ = differs.find([]).create(null);
}

set testReults(test:any) {
    this.testResultsItem = test;
    if (test && !this.differ) {
      this.differ = this.differs.find(test).create(this.changeDetector);
    }
}
ngDoCheck(){
    if (this.differ) {
        const changes = this.differ.diff(this.testResultsItem);
        if (changes) {
            console.log('FIRE!');
        }
    }
  }
 }

  • Angular 不检查对象或数组内部的变化。它只检查对象引用是否已检查。您可以使用 IterableDiffer 检查 ngDoCheck 中的更改。请发布演示您尝试过的代码的代码。更改 testResults 的代码在哪里?
  • testResults 在索引中链接的 main.js 文件中创建。从那里调用一个名为reporter.js 的js 文件,该文件返回数组中的对象。我尝试使用 IterableDiffer 来实现:不幸的是,我仍然没有让它启动。我将上面的代码添加到原始帖子中。

【解决方案1】:

如果您将模板更改为

template: `{{ testResultsItem | json }}

那么 Angular2 应该检测到变化

【讨论】:

  • 我试过了,它仍然没有在控制台中记录任何“检测到更改”的字符串
  • 我在上面评论中的问题呢?如果您更改代码中的输入,则不会调用 ngOnChanges 。它仅在 <test-results [testResultsItem]="valueFromParent"> 中的 valueFromParent 更改并且更改检测更新绑定时调用。您可以将 testResultsItem 设置为在每次分配新值时执行代码。
  • 我刚刚尝试了 IterableDiffers,但无法让它在更改数组时触发。我在原始问题中发布了上面的代码。当您说 valueFromParent 时,您指的是什么?就像来自父组件的点击事件?我应该将它与 ngOnChange 或 IterableDiffers 和 DoCheck 一起使用吗?
  • 您缺少差异的初始化。请参阅 angular.io/docs/ts/latest/api/core/index/DoCheck-class.html 中的 constructor
  • 谢谢,我明白了。我在构造函数中添加了 this.differ = differs.find([]).create(null); ,但它仍然没有触发。我修改了上面的代码以反映这一点。