2016-11-17 24 views
5

Có cách nào trong Angular2 có sự kiện được kích hoạt khi thành phần của tôi hiển thị không? Nó được đặt trong một tabcontrol và tôi muốn được thông báo khi người dùng chuyển mạch tôi muốn thành phần của tôi để kích hoạt một sự kiện.Sự kiện khi thành phần hiển thị

+0

Nếu đây là điều khiển tab bạn đã triển khai, chắc chắn bạn có thể thêm trình phát sự kiện và phát ra ở cùng một nơi bạn thay đổi tab? – Seer

+0

Tôi cũng sử dụng điều khiển tab của Primeng và sự kiện duy nhất tồn tại trước khi thay đổi, vì vậy điều khiển chưa hiển thị tại thời điểm này: ( – Shimrod

Trả lời

3

Điều cuối cùng tôi đã làm (không đẹp lắm nhưng hoạt động trong khi tôi không có cách nào tốt hơn để làm điều đó ...) là sử dụng gọi lại ngAfterContentChecked() và tự xử lý thay đổi.

@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

Bạn có thể sử dụng ngAfterViewInit() callback

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

+0

dường như không phù hợp với nhu cầu của tôi, tôi đã đặt nhật ký bên trong cuộc gọi lại này và nó chỉ được gọi một lần (bất kể thành phần của tôi có hiển thị hay không) – Shimrod

+3

Góc không có cách nào để biết khi nào một thành phần hiển thị nếu nó chỉ ẩn đằng sau phần tử DOM khác. Nếu bạn sử dụng '* ngIf =" "' để hiển thị/ẩn, sau đó thành phần khi tab được chọn hoặc bỏ chọn, sau đó 'ngAfterViewInit()' được gọi là mọi lúc –

1

Không có sự kiện như vậy, nhưng nếu bạn đang sử dụng một điều khiển tab, cách thích hợp để làm điều này sẽ tạo ra một sự thay đổi tab @Output cho điều khiển tab của bạn nếu tùy chỉnh, nếu không, hầu hết các điều khiển tab (như ng-bootstrap) cũng có một số sự kiện thay đổi tab.

Nếu thành phần của bạn phải biết điều này, bạn có thể sử dụng sự kiện thay đổi tab này để phát hiện tab nào hiển thị và nếu bạn biết tab nào hiển thị, bạn cũng biết liệu thành phần của mình có hiển thị hay không. Vì vậy, bạn có thể làm một cái gì đó như thế này:

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

Và sau đó bạn có thể gửi nó đến thành phần của bạn chính nó nếu bạn có một đầu vào:

@Input() activated: boolean = false; 

Và sau đó bạn có thể áp dụng nó với:

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

Bây giờ bạn có thể nghe OnChanges để xem giá trị mô hình activated có thay đổi thành true hay không.


Bạn cũng có thể cấu trúc này để sử dụng dịch vụ với một Observable như thế này:

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

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

Khi một thành phần mong muốn lắng nghe những thay đổi này, nó có thể đăng ký để tabService.observable. Khi tab của bạn thay đổi, bạn có thể đẩy các mục mới vào nó bằng tabService.observer.next().

+0

Đó là một ý tưởng tuyệt vời, tuy nhiên tôi không làm nó hoạt động trong trường hợp của tôi vì tabcontrol tôi sử dụng là từ primeng và họ chỉ cung cấp một sự kiện trên tab thay đổi _before_ tab đã thực sự thay đổi => thành phần của tôi không hiển thị tại thời điểm này ... – Shimrod

Các vấn đề liên quan