Angular2 erfrischenden Blick auf array-push
Ich kann nicht scheinen, um angular2 Ansicht aktualisiert werden, auf ein array.push-Funktion, aufgerufen von einem setInterval asynchronen Betrieb.
der code ist aus diesem eckige plunkr Beispiel mit der setInterval-Funktion:
Was ich versuche zu tun, ist wie folgt:
JS:
import {View, Component, bootstrap, Directive, ChangeDetectionStrategy, ChangeDetectorRef} from 'angular2/angular2'
@Component({selector: 'cmp', changeDetection: ChangeDetectionStrategy.OnPush})
@View({template: `Number of ticks: {{numberOfTicks}}`})
class Cmp {
numberOfTicks = [];
constructor(private ref: ChangeDetectorRef) {
setInterval(() => {
this.numberOfTicks.push(3);
this.ref.markForCheck();
}, 1000);
}
}
@Component({
selector: 'app',
changeDetection: ChangeDetectionStrategy.OnPush
})
@View({
template: `
<cmp><cmp>
`,
directives: [Cmp]
})
class App {
}
bootstrap(App);
HTML:
<!DOCTYPE html>
<html>
<head>
<title>angular2 playground</title>
<script src="https://code.angularjs.org/tools/traceur-runtime.js"></script>
<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script data-require="jasmine" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine.js"></script>
<script data-require="jasmine" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/jasmine-html.js"></script>
<script data-require="jasmine@*" data-semver="2.2.1" src="http://cdnjs.cloudflare.com/ajax/libs/jasmine/2.2.1/boot.js"></script>
<script src="config.js"></script>
<script src="https://code.angularjs.org/2.0.0-alpha.37/angular2.min.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</head>
<body>
<app></app>
</body>
</html>
Den oben genannten code funktioniert richtig, wenn "numberOfTicks" ist nur eine Zahl, (wie die plunker original-Beispiel zeigt), aber sobald ich es in ein array und push-Daten, es wird nicht aktualisiert.
Ich kann nicht scheinen, um zu verstehen, warum.
Folgende Verhalten ist ähnlich wie ein Problem, das ich habe, wenn Sie versuchen zu aktualisieren ein Diagramm in angular2 mit neuen Daten Punkte bei der Verwendung von setInterval /setTimeout.
Danke für die Hilfe.
- Ich werde erarbeiten - ich bin versucht, zu aktualisieren ein Diagramm in Echtzeit-Aktualisierung und Daten-array mit Hilfe der oben setInterval methodoligy, diese plunker könnte ein gutes Beispiel sein, um zu versuchen und erreichen das: plnkr.co/Bearbeiten/vdgKVJOymMYhiyqZrPma?p=Album Vorhören
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie aktualisieren Sie die ganze Referenz der Elemente in einem array nach dem hinzufügen eines Elements in es:
Bearbeiten
Den DoCheck-Schnittstelle könnte für Sie auch interessant, da es ermöglicht es Ihnen, schließen Sie Ihren eigenen change-detection-Algorithmus.
Finden Sie unter diesem link für mehr details:
Hier ist ein Beispiel:
Ist es denn eine Zahl ist eine JavaScript-primitive-Typ und ein array ist eine JavaScript-Referenz geben. Wenn Angular change detection ausgeführt wird, verwendet
===
zu bestimmen, ob eine Vorlage, die Bindung hat sich geändert.Wenn
{{numberOfTicks}}
ist ein primitiver Typ===
vergleicht die aktuellen und vorherigen Werte. Also die Werte0
und1
unterschiedlich sind.Wenn
{{numberOfTicks}}
ist ein Referenz-Typ,===
vergleicht die aktuellen und vorherigen (Bezugs -) Werte. Also, wenn die array-Referenz nicht ändern, Winkel nicht erkennen eine Veränderung. In deinem Fall, mitpush()
die array-Referenz ändert sich nicht.Wenn Sie den folgenden in Ihr template anstelle
dann Eckig würde die Ansicht aktualisieren, weil es eine Bindung zu jedem einzelnen array-element, sondern dann nur das array selbst. Also, wenn ein neues Element
push()
ed, oder einen vorhandenen Eintrag gelöscht oder geändert werden, alle diese änderungen werden erkannt.Also in deinem Diagramm plunker, sollten die folgenden Updates, wenn der Inhalt der
from
undto
arrays ändern:Gut, es aktualisiert wird, wenn jeder Artikel ist ein primitiver Typ.