Возможно, вы нашли решение для этого уже, но я столкнулся именно с этой проблемой недавно и нашел этот вопрос без ответа. Ключ, по-видимому, зависит от того, когда вы регистрируетесь для оповещений о событиях. Вы должны зарегистрироваться для события прокрутки после запуска события onload iframe. В моем коде я зарегистрировал событие onload iframe в своем шаблоне кода.
<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;
}
Затем в методе onFrameLoad() класса регистра RouteFrame для события прокрутки.
onFrameLoad() {
this.scroll$ = Observable.fromEvent(this.frame.nativeElement.contentWindow, 'scroll')
.debounceTime(200)
.subscribe((evt: any) => {
this.onScroll();
});
}
Затем в методе onScroll() выполните любую логику, в которой вы нуждаетесь. В моем случае я смотрел, когда пользователь прокручивается в нижней части iframe. Однако я обнаружил, что событие прокрутки происходило «вне» Углового, поэтому форма была переоценена Angular на изменении значения этой переменной, поэтому кнопка accept никогда не включалась, хотя у была [ disabled] = "! 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 вводится как другие угловые провайдеры в cstr класса RouteFrame.
constructor(@Inject(NgZone) private zone: NgZone, ....)
Для полноты отказа от подписки на прослушиватель событий прокрутки, когда компонент завершен.
NgOnDestroy() {
this.scroll$.unsubscribe();
}
Угловая версия 4.3.0