javascript - 打字稿滚动位置
问题描述
在我的角度 UI 代码中,我有一个组件类,它调用如下
app.component.html
//...
<div class="banner">
<p-dialog [(visible)]="displayCOI" styleClass="coiDialog" [contentStyle]="{'overflow-y': 'hidden'}" [modal]="true" [style]="{width: '75vw'}" [baseZIndex]="10000" [showHeader]="false"
[draggable]="false" [resizable]="false">
<coi (notify)="onCoIAccept($event)"></coi>
</p-dialog>
</div>
...///
coi.component.html 如下所示
<div>
<div class="row" style="padding: 10px 0px">
<div class="col-sm-4">
<p align="center"><b>Instructions</b></p>
<br>...//
</div>
<div #scrollDiv id="scrollDiv" class="col-sm-6" style="height:350px; overflow-y: scroll;" (scroll)="onScroll($event)">
<p-table #dt [columns]="cols" [scrollable]="true" [value]="usersLi" [(selection)]="selectedUsersLi" dataKey="id">
//....
..///
</p-table>
</div>
<div class="col-sm-2">
<div align="center">
<button pButton type="button" label="Accept" [disabled]="disableAccept" (click)="close()" class="ui-button-rounded"></button>
</a>
</div>
</dv>
</div>
coi.component.ts 代码如下:
export class coiComponent {
@ViewChild("scrollDiv") scrollDiv: ElementRef;
disableAccept: boolean = false;
ngOnInit():void {
this.keys = Object.keys(this.propertyObj);
this._utilService.convertKeysToHeader(this.keys,this.cols);
this.disableAccept = true;
this.loadRecords();
}
onScroll(event: any) {
// visible height + pixel scrolled >= total height
if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight) {
this.disableAccept = false;
console.log("End");
}
}
ngOnChanges(changes: SimpleChanges){
console.log("ngOnChanges" , changes);
for ( const propName in changes){
let change = changes[propName];
if ( propName == 'coi'){
// console.log('CHANGED...DO HERE');
console.log(this.scrollDiv.nativeElement.offsetHeight);
console.log(this.scrollDiv.nativeElement.scrollHeight);
}
}
}
}
如您所见,模态被分为 3 个 DIV。1. instrucations, 2: table, 3. Accept button
模态本身具有固定的高度和隐藏的滚动。带有表格的 div 具有固定的高度和溢出滚动,并且可以完美运行。现在该表可以包含 30-50 条记录,因此启用了垂直滚动。我希望仅当用户滚动表格并查看所有记录时才启用第三个 div 上的接受按钮。所以function (scroll)="onScroll($event)"
只有当滚动完全滚动并且它工作完美时才启用。
我的问题是某些用户可能会看到少于 5-10 条记录,这意味着不会为这些用户启用滚动,并且还需要为他们启用接受。请对如何执行此操作有任何建议吗?我尝试为名为“scrollDiv”和#scrollDiv 的div 标签添加一个ID,并将其作为ElementRef 传递,并在ngOnChange 上尝试获取offsetHeight 和scrollHeight,但在所有情况下我都得到值'0'。有人可以帮我吗这个?
我已经更新了我的问题。请给一些建议。谢谢你。
解决方案
我会尝试给你一个运行的想法,然后你可以理解并将它应用到你的案例中。你可以在这个链接上查看。
示例说明
在组件中,您需要考虑 4 个重要事项:
isActionDisabled
一个变量,表示您的操作是否应该被禁用@ViewChild('containerElement') containerElement
a 引用表格的可滚动容器onScrollContainer
滚动时执行的方法containerElement
disableByScroll
isActionDisabled
根据滚动条的位置改变 的值的方法containerElement
。如果它在底部isActionDisabled
,false
否则就是true
。
最重要的方法是disableByScroll
:
disableByScroll(): void {
if (this.containerElement) {
const element = this.containerElement.nativeElement;
this.isActionDisabled = !(
element.scrollTop ===
element.scrollHeight - element.clientHeight
);
} else {
this.isActionDisabled = true;
}
}
请阅读这篇文章以了解我的所作所为。
disableByScroll
每次调用滚动事件时调用containerElement
onScrollContainer(): void {
this.disableByScroll();
}
并在查看初始化之后
ngAfterViewInit(): void {
this.disableByScroll();
this.cdr.detectChanges();
}
如果您有许多未激活滚动条的项目,这将很有用。请阅读本指南以了解Angular 应用程序的生命周期事件。如您所见,我调用detectChanges
了ChangeDetectorRef
. 阅读该指南,您将了解原因。
关于模板,它非常简单,您可以弄清楚。
推荐阅读
- python - 使用 Dask 或 Joblib 构建并行 Sklearn 模型
- reactjs - 使用 apollo 客户端设置初始状态
- python - 使用正则表达式时出错。断言错误:得到
, 预期的 ` - javascript - 数组的属性如何
- java - 使用 FTP 将 Spring Boot app.jar 部署到 Azure 不起作用
- c# - 如何根据另一个属性从 json 列表中获取属性?
- django - 如何将 django 中的查询集转换为 json
- mysql - Mysql:如何在字符串列表中查找列值
- bash - 如何使用 Cadaver 上传名称中带有空格的文件?
- php - 在 PHP POST 表单中传递一个巨大的数组,以便基于这个数组创建一个 CSV 文件