- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们最近将可滚动列表转换为 CDK Virtual Scroller。 (带有 angular/cdk 7.3.7 的 Angular 7.2.12)
总之,似乎VirtualScrollViewport
正在回收组件实例,而不仅仅是文档建议的模板。
Live MCVE on StackBlitz (更新以反射(reflect)编辑 1)。
编辑 1
一位同事提醒我,我们现在使用命名引用而不是 ViewChildren()
,像这样:HelloComponent
(在 *cdkVirtualFor
内):
@Component({
selector: 'hello',
template: `<h1 [class.active]="active">Data Item {{item}} !</h1>`,
styles: [`.active {background-color: red; color: white}`]
})
export class HelloComponent {
@Input() item: any;
active: boolean = false;
toggle = () => this.active = !this.active;
}
<cdk-virtual-scroll-viewport itemSize="75">
<ng-container *cdkVirtualFor="let item of data" templateCacheSize=0>
<hello #hi [item]="item" (click)="clickByReference(hi)"></hello>
</ng-container>
</cdk-virtual-scroll-viewport>
// Non-essentials hidden, see StackBlitz
export class AppComponent {
data = Array.from(Array(100).keys())
clickByReference = (element: any): void => element.toggle();
}
templateCacheSize
可能有帮助,但没有。
@ViewChildren()
引用的组件。和
QueryList
并且我们使用
*ngFor
中的索引来跟踪我们正在执行的操作(现在
*cdkVirtualFor
),像这样:
<cdk-virtual-scroll-viewport itemSize="75">
<ng-container *cdkVirtualFor="let item of data; let i = index">
<hello #hi
[item]="item"
(click)="click(i)"></hello>
</ng-container>
</cdk-virtual-scroll-viewport>
export class AppComponent {
@ViewChildren('hi') hiRefs: QueryList<HelloComponent>;
data = Array.from(Array(100).keys())
click = (i: number) => this.hiRefs["_results"][i].say(`Hello as ${i}`);
}
n
被渲染到 DOM 中。因此,如果您向下滚动列表超出最初加载的内容,
hiRefs
不包含对具有相应索引的项目的引用,抛出
ReferenceError
对于提供的
["_results"][i]
.
trackBy
但没有取得任何成果。
HelloComponent
到
@Component({
selector: 'hello',
template: `<h1 [class.active]="active">Data Item {{item}} !</h1>`,
styles: [`.active {background-color: red}`]
})
export class HelloComponent {
@Input() item: any;
active: boolean;
say = (something: any) => this.active = !this.active;
}
<hello #hi [item]="item" (click)="clickByReference(hi)"></hello>
@ViewChildren()
QueryList
根本!
clickByReference()
更新了 StackBlitz ,并将上面的重命名为
clickByIndex()
.
最佳答案
默认情况下,CdkVirtualForOf
caches 20 ViewRef
s到不再呈现到 DOM 中的组件以提高滚动性能。
虽然这些更新显示新的界限 @Input()
s,它们不会更新它们的内部状态,因此之前缓存的副本会被重新使用。
似乎唯一的解决方案是设置 templateCacheSize: 0
:
<ng-container *cdkVirtualFor="let item of data; templateCacheSize: 0">
关于angular - 在 cdk-virtual-scroller 中获取静态组件引用? (引用文献被回收),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696084/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我对描述 PHP 内部工作原理、陷阱和一些高级功能的文献(互联网上的文章、杂志、书籍、播客 - 我真的不介意任何东西)很感兴趣。那里有这样的东西吗?我试着在谷歌上搜索,但大多数文章都是关于从 PHP
我知道这个问题的答案是否可能是主观的,(而且我还没有找到类似的问题)但我的问题如下: 我在互联网/文献上看到过不同来源的代码片段,其中一个来 self 项目中的队友。通常他们中的一些人会采用类似...
我是一名优秀的程序员,十分优秀!