gpt4 book ai didi

javascript - 数组推送的 Angular2 刷新 View

转载 作者:可可西里 更新时间:2023-11-01 01:47:21 24 4
gpt4 key购买 nike

我似乎无法在 array.push 函数上更新 angular2 View ,这是从 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 中的图形时遇到的问题。

感谢您的帮助。

最佳答案

您需要在添加元素后更新数组的整个引用:

  constructor(private ref: ChangeDetectorRef) {
setInterval(() => {
this.numberOfTicks.push(3);
this.numberOfTicks = this.numberOfTicks.slice();
this.ref.markForCheck();
}, 1000);
}
}

编辑

DoCheck 接口(interface)也可能会让您感兴趣,因为它允许您插入自己的更改检测算法。

有关详细信息,请参阅此链接:

这是一个示例:

@Component({
selector: 'custom-check',
template: `
<ul>
<li *ngFor="#line of logs">{{line}}</li>
</ul>`
})
class CustomCheckComponent implements DoCheck {
@Input() list: any[];
differ: any;
logs = [];

constructor(differs: IterableDiffers) {
this.differ = differs.find([]).create(null);
}

ngDoCheck() {
var changes = this.differ.diff(this.list);
if (changes) {
changes.forEachAddedItem(r => this.logs.push('added ' + r.item));
changes.forEachRemovedItem(r => this.logs.push('removed ' + r.item))
}
}
}

关于javascript - 数组推送的 Angular2 刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com