Warm tip: This article is reproduced from serverfault.com, please click

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

(css - Angular 2: Detect changes in browser width and update model)

发布于 2016-09-17 18:45:39

在我的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;
    }   
}

这使我的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"; 
}   

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

<div>
    {{getWidthRange()==='small'? shortText : longText}}
</div>

更好的是,我将设置一个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

然后,widthRangeChanges当接收到新范围时,组件可以订阅并更新模型值。我如何获得此信息Angular 2

Angular 2 rc-6typescript 2.0.2rxjs 5 beta 11

Questioner
BeetleJuice
Viewed
0
yurzui 2016-09-18 03:03:49

你可以使用fromEventRxJS的运算符:

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

   $resizeEvent.subscribe(data => {
     this.width = data;
   });

柱塞示例