您可能已經找到了解決方案,但我最近發現了這個問題,最近發現這個問題沒有答案。 關鍵似乎是您註冊事件通知時的時間。在iframe的onload事件觸發後,您必須註冊滾動事件。在我的代碼中,我在模板代碼中註冊了iframe的onload事件。
<form ngNoForm action="/logout" method="post" role="form">
<div class="container-fluid main">
<iframe #tframe [src]="src" class="frame" (load)="onFrameLoad()"> </iframe>
<div class="clearfix">
<div class="pull-right">
<button type="submit" class="btn btn-dialog-secondary">{{'common.decline' | i18n}}</button>
<button type="button" [disabled]="!scrollBottom" id="defaultFocus" class="btn btn-primary" (click)="accept()">{{'common.accept' | i18n}}</button>
</div>
</div>
</div>
</form>
在類本身我的iframe ElementRef成員(如藏漢,我想響應滾動事件更新, 後來更多在這個答案的布爾成員..)。
export class RouteFrame implements AfterViewInit {
scrollBottom: boolean = false;
@ViewChild('tframe') frame : ElementRef;
scroll$: any = null;
}在RouteFrame類寄存器滾動事件的onFrameLoad()方法
然後。
onFrameLoad() {
this.scroll$ = Observable.fromEvent(this.frame.nativeElement.contentWindow, 'scroll')
.debounceTime(200)
.subscribe((evt: any) => {
this.onScroll();
});
}
然後在onScroll()方法中,執行所需的任何邏輯。在我看來,當用戶滾動到iframe的底部。 但是我發現滾動事件正在Angular的「外部」發生,所以表單由Angular對該變量值的變化進行了重新評估,因此即使它的 有[禁用] =「!scrollBottom」作爲其聲明的一部分。因此,爲什麼scrollBottom變量的更新被封裝在this.zone.run()中。
onScroll() {
if (this.frame.nativeElement.contentWindow.scrollY > this.frame.nativeElement.contentWindow.innerHeight) {
this.zone.run(() => {
this.scrollBottom = true;
});
}
}
this.zone只是像其他Angular提供程序一樣注入到RouteFrame類的cstr中。
constructor(@Inject(NgZone) private zone: NgZone, ....)
爲了完整性,在組件完成時取消訂閱滾動事件偵聽器。
NgOnDestroy() {
this.scroll$.unsubscribe();
}
角版本4.3.0