2016-02-20 20 views
25

Cố gắng tìm hiểu cách lấy chiều rộng cửa sổ về thay đổi kích thước sự kiện trong Angular2. Đây là mã của tôi:Angular2 nhận chiều rộng cửa sổ onResize

export class SideNav { 

    innerWidth: number; 

    constructor(private window: Window){ 

     let getWindow = function(){ 
      return window.innerWidth; 
     }; 

     window.onresize = function() { 
      this.innerWidth = getWindow(); 
      console.log(getWindow()); 
     }; 
} 

Tôi đang nhập nhà cung cấp cửa sổ trên toàn cầu vào tệp bootstrap.ts bằng cách cung cấp quyền truy cập trên ứng dụng của tôi vào cửa sổ. Vấn đề tôi đang gặp là điều này cho tôi một kích thước cửa sổ, nhưng thay đổi kích thước cửa sổ - nó chỉ lặp lại cùng một kích thước hơn và hơn ngay cả khi cửa sổ thay đổi kích thước. Xem hình ảnh cho ví dụ về console.log: Screenshot image

Mục tiêu tổng thể của tôi là có thể đặt số cửa sổ thành biến để tôi có thể truy cập vào mẫu đó trong mẫu. Bất kỳ ý tưởng về những gì tôi đang làm sai ở đây?

Cảm ơn!

Trả lời

51
<div (window:resize)="onResize($event)" 
onResize(event) { 
    event.target.innerWidth; 
} 

để nhận được thông báo về sự kiện di chuyển trên một phần tử con trong một thành phần mẫu

hoặc nghe về các thành phần nguyên tố chủ bản thân

@HostListener('window:resize', ['$event']) 
onResize(event) { 
    event.target.innerWidth; 
} 
+0

tại sao bạn nhận xét ra @Hostlistener? Đối với tôi nó chỉ hoạt động mà không có bình luận-slashes, nhưng sau đó nó hoạt động hoàn hảo :-) –

+1

Nó có nghĩa là một cách thay thế. Bạn có thể thêm nó vào một phần tử trong khuôn mẫu như được hiển thị trong đoạn mã đầu tiên được cắt hoặc sử dụng một '@HostListener()' để lắng nghe chính thành phần của máy chủ thành phần đó. Tôi đã cập nhật câu trả lời của mình để làm cho nó rõ ràng hơn. –

7

Trong trường hợp này bạn cần phải chạy phát hiện thay đổi theo cách thủ công. Khi bạn đang sửa đổi biến thành phần từ ngữ cảnh bên ngoài của Góc, về cơ bản, thay đổi kích thước sự kiện sẽ không bị khỉ vá bởi hệ thống phát hiện thay đổi Angular2.

import {ChangeDetectorRef} from 'angular2/core' 

export class SideNav { 
    innerWidth: number; 

    constructor(private window: Window, private cdr: ChangeDetectorRef){ 

     let getWindow =() => { 
      return window.innerWidth; 
     }; 

     window.onresize =() => { 
      this.innerWidth = getWindow(); 
      this.cdr.detectChanges(); //running change detection manually 
     }; 
    } 
} 

Thay Tôi muốn đề nghị bạn để đi cho this answer, trông sạch hơn

+1

điều này thật thú vị khi tìm hiểu về sự thay đổi - nhưng tôi thực sự vui vì bạn đã chỉ cho tôi giải pháp Quan sát được - tôi có thể thêm một dịch vụ mới cho chiều rộng và chiều cao cửa sổ toàn cầu theo cách sạch sẽ có thể tái sử dụng với nó - vì vậy cảm ơn bạn nhiều! –

19

Sử dụng NgZone để kích hoạt sự thay đổi phát hiện:

constructor(ngZone:NgZone) { 
    window.onresize = (e) => 
    { 
     ngZone.run(() => { 
      this.width = window.innerWidth; 
      this.height = window.innerHeight; 
     }); 
    }; 
} 
+0

ý tưởng thú vị với ngZone - Tôi sẽ phải thử nó! Hiện đang sử dụng triển khai có thể quan sát để tự động phát hiện các thay đổi. –

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