2016-07-03 9 views
0

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!'); 
     } 
    } 
    } 
} 
+0

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? –

+0

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

Antwort

0

Wenn Sie Ihr tempalte ändern

template: `{{ testResultsItem | json }} 

dann sollten Angular2 die Änderungen erkennen

+0

Ich versuchte dies und es protokollierte immer noch keine "Change erkannt" Zeichenfolgen in der Konsole – kahls

+0

Was ist mit meinen Fragen in den Kommentar oben? Wenn Sie eine Eingabe in Ihrem Code ändern, wird 'ngOnChanges' nicht aufgerufen. Es wird nur aufgerufen, wenn sich 'valueFromParent' in' 'ändert und die Erkennung die Bindung aktualisiert. Sie können 'testResultsItem' veranlassen, einen Setter Code jedes Mal auszuführen, wenn ein neuer Wert zugewiesen wird. –

+0

Ich habe gerade versucht, IterableDiffers, aber war nicht in der Lage, es auf Änderungen an der Array zu feuern. Ich habe den obigen Code in der ursprünglichen Frage gepostet. Wenn Sie valueFromParent sagen, worauf beziehen Sie sich? Wie ein Klick-Ereignis von der übergeordneten Komponente? Soll ich das mit ngOnChange oder mit IterableDiffers und DoCheck verwenden? – kahls