2016-11-17 44 views
5

Czy jest jakiś sposób w Angular2, aby zdarzenie zostało wywołane, gdy mój komponent stanie się widoczny? Jest on umieszczony w tabControl i chcę otrzymać powiadomienie, gdy użytkownik się przełącza Chciałbym, aby mój komponent wywołał zdarzenie.Zdarzenie, gdy składnik staje się widoczny

+0

Jeśli jest to zaimplementowane sterowanie kartą, z pewnością można dodać emitera zdarzeń i emitować w tym samym miejscu, w którym zmienia się zakładkę? – Seer

+0

Używam kontrolki zakładki primeng, a jedyne zdarzenie, które istnieje, jest wywoływane przed zmianą, więc kontrola nie jest jeszcze widoczna w tym czasie :( – Shimrod

Odpowiedz

3

Co w końcu zrobiłem (co nie jest piękne, ale działa, gdy nie mam lepszego sposobu na zrobienie tego ...), należy użyć wywołania zwrotnego ngAfterContentChecked() i samodzielnie obsłużyć zmianę.

@ViewChild('map') m; 
private isVisible: boolean = false; 
ngAfterContentChecked(): void 
{ 
    if (this.isVisible == false && this.m.nativeElement.offsetParent != null) 
    { 
     console.log('isVisible switched from false to true'); 
     this.isVisible = true; 
     this.Refresh(); 
    } 
    else if (this.isVisible == true && this.m.nativeElement.offsetParent == null) 
    { 
     console.log('isVisible switched from true to false'); 
     this.isVisible = false; 
    } 
} 
5

Można użyć ngAfterViewInit() zwrotnego

https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html

+0

to nie pasuje do moich potrzeb, umieściłem log wewnątrz tego wywołania zwrotnego i jest wywoływana tylko raz (niezależnie od tego, czy mój komponent jest widoczny czy nie) – Shimrod

+3

Angular nie ma możliwości sprawdzenia, kiedy komponent staje się widoczny, jeśli jest ukryty za innym elementem DOM .. Jeśli użyjesz '* ngIf =" "' do pokazania/ukrycia, a następnie komponentu, gdy zakładka jest zaznaczona lub odznaczona, wtedy 'ngAfterViewInit()' jest wywoływana za każdym razem –

1

Nie ma takiego zdarzenia, ale jeśli używasz formantu karty, właściwy sposób to zrobić byłoby utworzyć zmianę zakładki @Output dla kontrolka na karcie, jeśli jest niestandardowa, w przeciwnym razie większość elementów sterujących na karcie (takich jak ng-bootstrap) również ma pewne zdarzenia związane z wymianą kart.

Jeśli Twój komponent musi być tego świadomy, możesz użyć tego zdarzenia zmiany karty, aby wykryć, która karta jest widoczna, a jeśli wiesz, która karta jest widoczna, wiesz również, czy Twój składnik jest widoczny, czy nie. Więc można zrobić coś takiego:

onTabChange(event) { 
    this.currentTab = /** Get current tab */; 
} 

a następnie można przesłać go do siebie komponentu jeśli masz wejście:

@Input() activated: boolean = false; 

a następnie można zastosować go z:

<my-component [activated]="currentTab == 'tabWithComponent'"></my-component> 

Teraz można posłuchać OnChanges, aby sprawdzić, czy wartość modelu activated została zmieniona na true.


Można również byłaby to skorzystać z usługi z Observable tak:

@Injectable() 
export class TabService { 
    observable: Observable<any>; 
    observer; 

    constructor() { 
    this.observable = Observable.create(function(observer) { 
     this.observer = observer; 
    }); 
    } 
} 

Kiedy składnikiem chce słuchać tych zmian, może zapisać się do tabService.observable. Gdy twoja karta się zmieni, możesz przesłać do niej nowe elementy za pomocą tabService.observer.next().

+0

To świetny pomysł, jednak nie działam w moim przypadku ponieważ tabcontrol którego używam jest z primeng i dostarczają tylko zdarzenia na zmianie karty _ zanim książka się zmieniła>> mój komponent nie jest widoczny w tej chwili ... – Shimrod