Ich erstelle eine App mit Angular 2 mit Electron & Node. Es gibt Tests, die auf dem Server ausgeführt werden, und die Ergebnisse werden nacheinander in einem globalen Variablen-Array namens testResults ausgegeben. Ich habe kein Problem, dass in Schräg ziehen mit:Wie beobachtet man Änderungen an einer globalen serverseitigen Variable in Angular 2
declare var testResults: any;
Allerdings habe ich kein Glück hatte immer Angular ein Ereignis auszulösen, wenn ein Objekt in das Array hinzugefügt wird. Gibt es eine Möglichkeit, auf Änderungen in diesem Array zu achten? Ich habe an Changes und DoCheck versucht, habe aber kein Glück gehabt.
Dies ist, was ich für meine Komponente haben:
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);
}
}
Wenn ich ein setInterval ausführen, die das Array in der Konsole protokolliert jede Sekunde ich die Änderungen in der Konsole auf das Array sehen tun. Sie werden auch im DOM unter {{testResults}} aktualisiert. Aber es sollte einen Weg geben, dass eckig diese Änderung erkennt, anstatt einen setInterval auszuführen, richtig? Jede Hilfe wäre willkommen!
Hier ist, wenn ich mit IterableDiffers versucht:
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!');
}
}
}
}
Winkelprüfzone nicht für Änderungen innerhalb Objekte oder Array. Es prüft nur, ob eine Objektreferenz markiert ist. Sie können den 'IterableDiffer' verwenden, um nach Änderungen in' ngDoCheck' zu suchen. Bitte schreiben Sie den Code, der zeigt, was Sie versucht haben. Wo ist der Code, der "testResults" ändert? –
testResults wird in einer main.js-Datei erstellt, die im Index verknüpft ist. Von dort gibt es Aufrufe an eine js-Datei mit dem Namen reporter.js, die die Objekte im Array zurückgibt. Ich habe versucht, mit IterableDiffer zu implementieren: Leider bekomme ich es immer noch nicht zu feuern. Ich habe den Code oben zum ursprünglichen Beitrag hinzugefügt. – kahls