【问题标题】:EventEmitter does not work on Chrome/SafariEventEmitter 在 Chrome/Safari 上不起作用
【发布时间】:2016-04-07 09:25:49
【问题描述】:

我创建了(在很多帮助下)以下指令,我在其中跟踪屏幕的 Y 位置并使用此信息触发事件。

import {Directive, Output, EventEmitter} from "angular2/core";

@Directive({
    selector: '[track-scroll]',
    host: {'(window:scroll)': 'track($event)'},

})

export class TrackScrollDirective {
    @Output('pageYPositionChange') pageYPositionChange: EventEmitter<any> = new EventEmitter();


    track($event: any) {
        this.pageYPositionChange.emit($event.pageY);
    }
}

并尝试在组件中监听该事件:

import {TrackScrollDirective} from "../directives/track-scroll.directive";

@Component({
    selector: 'app-header',
    moduleId: module.id,
    templateUrl: './app-header.component.html',
    directives: [Collapse, DROPDOWN_DIRECTIVES, ROUTER_DIRECTIVES, TrackScrollDirective]
})

export class AppHeader {
    public isCollapsed:boolean = false;

    pageY: number = 0;

    constructor (
        public authService: AuthenticationService
    ) {}

    onPageYChange(pageY: number) {
        this.pageY = pageY;
        console.debug("PageY Pos ", pageY );
    }
}

在该组件的模板中,我们有如下内容:

<nav class="navbar navbar-default navbar-fixed-top top-navbar" track-scroll (pageYPositionChange)="onPageYChange($event)" [ngClass]="{floating: pageY > 10}">

在 FF 中一切都很好,但仅此而已,别无他法。 (尝试过 safari,chrome)

缺少什么?我唯一的想法是我用错了EventEmitter

更新

显然$event.pageY 在 chrome 中不存在...实际上根本没有关于页面位置的信息。我从哪里得到它?

【问题讨论】:

  • 在safari和chrome下是否调用了track方法?我的意思是如果在这些浏览器中触发滚动事件...
  • 在调用 track 函数时尝试 console.logging $event。
  • stackoverflow.com/a/36468377/217408 中所示的document.body.scrollTop 怎么样?

标签: google-chrome events safari angular


【解决方案1】:

https://plnkr.co/edit/3EIMK6?p=preview

import {EventEmitter, HostListener, Component, Directive, Output} from 'angular2/core'

@Directive({
  selector: '[track-scroll]',
  // host: {'(window:scroll)': 'track($event)'},
})
export class TrackScrollDirective {
  @Output() pageYPositionChange:EventEmitter<any> = new EventEmitter();

  constructor() {
    console.log('TrackScrollDirective');
  }

  @HostListener('window:scroll', ['$event'])
  track(event:any) {
    this.pageYPositionChange.emit(document.body.scrollTop);
  }
}
@Component({
  selector: 'app-header',
//  moduleId: module.id,
  template: `xxx
  <div class="container-fluid" track-scroll (pageYPositionChange)="onPageYChange($event)">
      <div class="row">
          <div class="col-md-12">
              <app-header></app-header>
              <secure-outlet signin="Login" unauthorized="AccessDenied"></secure-outlet>
          </div>
      </div>
  </div>
  `,
  directives: [TrackScrollDirective]
})
export class AppHeader {
  public isCollapsed:boolean = false;

  pageY:number = 0;

  constructor(/*public authService:AuthenticationService*/) {
    console.log('AppHeader');
  }

  onPageYChange(pageY:number) {
    this.pageY = pageY;
    console.debug("PageY Pos ", pageY);
  }
}
@Component({
  selector: 'my-app',
  directives: [AppHeader],
  template: `
  <h2>Hello</h2>
  <app-header></app-header>
  <div style="height: 200vh; border: 5px solid red;"></div>
`
})
export class App {
}

【讨论】:

  • 现在这个 document.body.scrollTop 在 FF 中不起作用:D
  • 需要改用document.documentElement.scrollTopdocument.body.scrollTop 已弃用。但这不适用于 Chrome :(
  • 我需要这样做:track(event:any) { console.debug("document.body.scrollTop", this.posTop()); this.pageYPositionChange.emit(this.posTop()); } posTop() { return typeof window.pageYOffset != 'undefined' ? window.pageYOffset: document.documentElement.scrollTop? document.documentElement.scrollTop: document.body.scrollTop? document.body.scrollTop:0; }
猜你喜欢
  • 2016-10-02
  • 2014-10-12
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多