Angular 2:检测浏览器宽度的变化并更新模型

Bee*_*ice 3 css sass rxjs typescript angular

在我的Angular 2应用程序中,我根据浏览器窗口宽度更改样式.这是一个示例(SCSS):

.content{
    /*styles for narrow screens*/
    @media (max-width: 750px){
        background-color:beige;
    }
    /*styles for medium screens*/
    @media (min-width: 751px) and (max-width: 1200px) {
        background-color:red;
    }
    /*styles for wide screens*/
    @media (min-width: 1201px) {
        background-color:brown;
    }   
}
Run Code Online (Sandbox Code Playgroud)

这使我的UI响应.我希望我的Angular组件知道哪个宽度间隔是最新的:

/* Returns which of the CSS width intervals is current*/
getWidthRange(){
    let pixelWidth = ...; //what goes here?

    if(pixelWidth < 251) return "small";
    if(pixelWidth < 451) return "medium";
    return "large"; 
}   
Run Code Online (Sandbox Code Playgroud)

组件将调用此函数并根据宽度调整其行为.例如,下面的模板将在更宽的屏幕上显示更多内容:

<div>
    {{getWidthRange()==='small'? shortText : longText}}
</div>
Run Code Online (Sandbox Code Playgroud)

更好的是,我会设置一个Observable,当浏览器从一个范围转换到下一个范围时发出:

widthRangeChanges = Observable.create( observer => 
    {       
        // ? how to detect when width changes
        let oldRange = '...';
        let newRange = '...';
        if(newRange!==oldRange) observer.next(newRange);
    }
).share(); //all subscribers share same output channel
Run Code Online (Sandbox Code Playgroud)

然后,组件可以widthRangeChanges在接收到新范围时订阅并更新模型值.我怎样才能掌握这些信息Angular 2

Angular 2 rc-6,typescript 2.0.2,rxjs 5 beta 11

yur*_*zui 14

您可以使用fromEventRxJS的运算符:

 const $resizeEvent = Observable.fromEvent(window, 'resize')
   .map(() => {
     return document.documentElement.clientWidth;
   })
   .debounceTime(200)

   $resizeEvent.subscribe(data => {
     this.width = data;
   });
Run Code Online (Sandbox Code Playgroud)

Plunker示例