Я хотел бы выполнить некоторые задачи на основе события изменения размера окна (при загрузке и динамически).
В настоящее время у меня есть DOM следующим образом:
<div id="Harbour">
<div id="Port" (window:resize)="onResize($event)" >
<router-outlet></router-outlet>
</div>
</div>
Событие правильно срабатывает
export class AppComponent {
onResize(event) {
console.log(event);
}
}
Как получить ширину и высоту из этого объекта события?
Спасибо.
javascript
angular
DanAbdn
источник
источник
innerHeight
иinnerWidth
свойства ..console.log(event.target.innerWidth )
Ответы:
или используя декоратор HostListener :
Поддерживаемые глобальные цели являются
window
,document
иbody
.До тех пор, пока https://github.com/angular/angular/issues/13248 не будет реализован в Angular, для производительности лучше обязательно подписываться на события DOM и использовать RXJS для уменьшения количества событий, как показано в некоторых других ответах.
источник
document
,window
иbody
github.com/angular/angular/blob/...import { Component, OnInit, HostListener } from '@angular/core';
@ Гюнтер ответил правильно. Я просто хотел предложить еще один метод.
Вы также можете добавить привязку к хосту внутри
@Component()
-decorator. Вы можете поместить событие и требуемый вызов функции в свойство метаданных хоста следующим образом:источник
window.innerWidth
изнутриngOnInit
илиngAfterViewInit
методы?Я знаю, что это было задано давно, но есть лучший способ сделать это сейчас! Я не уверен, что кто-нибудь увидит этот ответ, хотя. Очевидно, ваш импорт:
Тогда в вашем компоненте:
Тогда обязательно отписывайтесь на уничтожить!
источник
import { fromEvent, Observable,Subscription } from "rxjs";
this.resizeSubscription$ = this.resizeObservable$.pipe(debounceTime(1000)).subscribe( evt => { console.log('event: ', evt) })
Правильный способ сделать это - использовать класс EventManager для связывания события. Это позволяет вашему коду работать на альтернативных платформах, например, рендеринг на стороне сервера с Angular Universal.
Использовать компонент так же просто, как добавить эту службу в качестве провайдера в ваш app.module и затем импортировать ее в конструктор компонента.
источник
window
объекта, как сервер не имеетwindow
. Я не знаком с различными мобильными конфигурациями, но вы должны быть в состоянии легко адаптировать приведенный выше код для привязки к правильному слушателю глобального событияMobile does not have a window object
.... как вы думаете, почему в мобильных браузерах нет оконного объекта?Вот лучший способ сделать это. На основании ответа Бировского .
Шаг 1: Создайте с
angular service
помощью RxJS Observables .Шаг 2: Введите вышеизложенное
service
и подпишитесь на любое изObservables
созданных в службе, где бы вы ни хотели получать событие изменения размера окна.Хорошее понимание Реактивного Программирования всегда поможет в преодолении трудных проблем. Надеюсь, это кому-нибудь поможет.
источник
Я не видел , чтобы кто говорить о
MediaMatcher
изangular/cdk
.Вы можете определить MediaQuery и присоединить к нему слушателя - тогда в любом месте вашего шаблона (или ts) вы можете вызывать вещи, если совпадает Matcher. LiveExample
App.Component.ts
App.Component.Html
App.Component.css
источник: https://material.angular.io/components/sidenav/overview
источник
Предполагая, что <600px означает мобильность для вас, вы можете использовать это наблюдаемое и подписаться на него:
Сначала нам нужен текущий размер окна. Таким образом, мы создаем наблюдаемую, которая испускает только одно значение: текущий размер окна.
Затем нам нужно создать еще одну наблюдаемую, чтобы мы знали, когда был изменен размер окна. Для этого мы можем использовать оператор fromEvent. Чтобы узнать больше об операторах rxjs, пожалуйста, посетите: rxjs
Объедините эти два потока, чтобы получить нашу наблюдаемую:
Теперь вы можете подписаться на это так:
Не забудьте отписаться :)
источник
В угловом CDK есть сервис ViewportRuler . Он работает за пределами зоны и также работает с рендерингом на стороне сервера.
источник
Основываясь на решении @cgatian, я бы предложил следующее упрощение:
Использование:
источник
Это не совсем ответ на вопрос, но он может помочь кому-то, кто должен обнаружить изменения размера любого элемента.
Я создал библиотеку, которая добавляет
resized
событие к любому элементу - Angular Resize Event .Он внутренне использует
ResizeSensor
из CSS Element Queries .Пример использования
HTML
Машинопись
источник
Я написал эту библиотеку, чтобы найти один раз изменение размера компонента в Angular, может ли это помочь другим людям. Вы можете поместить его в корневой компонент, сделав то же самое, что и изменение размера окна.
Шаг 1: Импортировать модуль
Шаг 2: Добавьте директиву, как показано ниже
<simple-component boundSensor></simple-component>
Шаг 3: Получите детали размера границы
источник
На Angular2 (2.1.0) я использую ngZone для захвата события смены экрана.
Взгляните на пример:
Я надеюсь, что это поможет!
источник
Код ниже позволяет наблюдать за любым изменением размера для любого данного div в Angular.
затем в компоненте:
источник
все решения не работают со стороны сервера или в угловых универсальных
источник
Я проверил большинство из этих ответов. Затем решил проверить угловую документацию по макету .
Angular имеет собственный Observer для обнаружения различных размеров, и его легко внедрить в компонент или Сервис.
простой пример будет:
Надеюсь, поможет
источник