2016-04-07 22 views
1

Bir ekranın Y konumunu izlediğim ve bu bilgilerle bir olayı tetiklediğim (çok fazla yardıma sahip), aşağıdaki yönergeyi oluşturdum.EventEmitter, Chrome/Safari üzerinde çalışmaz

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); 
    } 
} 

Ve bileşeninde halinde dinlemek için çalışıyor şu şekildedir:

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); 
    } 
} 

o bileşenin şablonda Elimizdeki:

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

Her şey FF çekici bir şekilde çalıştığını, ama bununla ilgili, başka hiçbir yerde değil. (safari, krom denedi)

Neler eksik? Benim tek düşünce ben

Görünüşe $event.pageY krom var olmayan yanlış EventEmitter

UPDATE kullanıyorum ... ve aslında hiç sayfa konumu hakkında herhangi bir bilgi yoktur olmasıdır. Onu nereden alabilirim?

+1

'track' yöntemi safari ve krom söz konusu olur mu? Bu tarayıcılarda kaydırma olayı tetiklenirse ... –

+0

Parça işlevi çağrıldığında konsolun $ olayını çalıştırmayı deneyin. – philoniare

+1

http://stackoverflow.com/a/36468377/217408 adresinde gösterilen 'document.body.scrollTop' benzeri nedir? –

cevap

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 { 
} 
+0

Teşekkürler, bayım! –

+0

Ve şimdi bu 'document.body.scrollTop' FF'de çalışmıyor: D –

+2

Bunun yerine' document.documentElement.scrollTop' kullanmanız gerekiyor. document.body.scrollTop 'kullanımdan kaldırıldı. Ancak bu, Chrome :( –

İlgili konular