【发布时间】:2016-03-27 11:56:09
【问题描述】:
我似乎无法在 array.push 函数上更新 angular2 视图,该函数从 setInterval 异步操作调用。
代码来自这个angular plunkr example of setInterval:
我想要做的如下:
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);
<!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>
如果“numberOfTicks”只是一个数字,上述代码将正常工作(如 plunker 原始示例所示),但一旦我将其更改为数组并推送数据,它就不会更新。
我似乎无法理解为什么会这样。
以下行为类似于我在使用 setInterval / setTimeout 时尝试使用新数据点更新 angular2 中的图表时遇到的问题。
感谢您的帮助。
【问题讨论】:
-
我会详细说明 - 我正在尝试通过使用上述 setInterval 方法更新它的数据数组来实时更新图表,这个 plunker 可能是一个很好的例子来尝试实现这一点:plnkr.co/edit/vdgKVJOymMYhiyqZrPma?p=preview
标签: javascript arrays asynchronous angular setinterval