【发布时间】:2017-12-19 06:14:40
【问题描述】:
我有一个更大的项目,我有 4 个嵌套的 *ngFor。所以创作大约有 200 行长,我认为分享不会有帮助,所以我尽可能地解释它。 问题是在刷新对象后,元素被销毁并重新创建。这会导致性能问题(我只关心 0,5 秒)和滚动回顶部。这是我的问题,我不希望这种情况发生。
数组:
array[0-X] = For Paginator
array[X][1-3] = contains 3 columns // #Column
array[X][X][1-9] = divides the column in 9 blocks // #InfoBlock
array[X][X][X][1-X] = the content of the single blocks // #Info
创建后,用户只能将#Info 元素移动到他想要的任何位置。
例如将#Info 移动到不同的#InfoBlock。通过订阅,我将更改保存到数据库并重新加载整个数组。
像这样:
this.pageinator = result;
现在它破坏了 div 并创建了新的,这导致我的布局滚动到顶部。我尝试了trackby,但是整个数组被覆盖的原因它不起作用。
问题: 有没有办法比较 2 个数组,然后对前一个数组进行更改。我知道我无法重新加载数据,但这可能会导致问题,因为该软件并非仅由 1 个用户使用。
编辑:一个例子
array[0][1][1][1] = "Content X"
array[0][1][2][2] = undefined
// After reloading
array[0][1][1][1] = undefined
array[0][1][2][2] = "Content X"
// Now I want Angular to just change this 2 elements, cause the others stay the same.
编辑 2: 我发现有时:
this.pageinator = result;
自动只接受更改。这种情况发生在十分之一的情况下。
【问题讨论】:
-
使用 trackBy 并且不重新创建数组,而是清除并用新元素填充先前的数组。
-
@GünterZöchbauer 有没有一种简单的好方法可以做到这一点?我唯一想到的是循环遍历两个数组,锁定更改,然后推送,删除,相应地更改。在每次删除时,推我都必须重新运行循环。这会导致 10 000 多个元素导致负载大幅增加。
-
Angulars IterableDiffer 应该为您提供增量。
NgFor使用它。 -
@GünterZöchbauer 会去看看。
-
@GünterZöchbauer Ty,我将
[ngForTrackBy]添加到每个并创建了一个返回索引的小函数。它没有直接工作,但由于一些角度版本开始像魅力一样工作。仍然只是覆盖数组但可以工作。
标签: arrays angular typescript