10
votes

Recherche de ResizeObserver avec Typescript dans Angular 9

J'essaye d'implémenter un ResizeObserver dans une application angulaire:

@types/resize-observer-browser

... et je rencontre l'erreur TS:

TS2304: Cannot find name 'ResizeObserver'.

J'ai essayé de mettre à jour ma définition de type avec:

const obs = new ResizeObserver(e => {
      // ...
});

... mais mon problème persiste. Existe-t-il une solution souhaitable ou une solution de contournement commune, ou serait-il préférable d'utiliser un package NPM tel que 'resize-observer' pour continuer à avancer?

Heureux d'inclure plus d'informations si nécessaire.

Tks!


0 commentaires

6 Réponses :


5
votes

Je n'ai jamais utilisé ResizeObserver, mais j'utilise fromEvent de RxJS avec l'événement resize et cela fonctionne bien. Voici le code pour cela.

import { fromEvent, Observable, Subscription } from "rxjs";

resizeObservable$: Observable<Event>;
resizeSubscription$: Subscription;

ngOnInit() {
  this.resizeObservable$ = fromEvent(element, 'resize')
  this.resizeSubscription$ = this.resizeObservable$.subscribe(evt => {
     // do whatever you waant
  })
}

ngOnDestroy() {
  this.resizeSubscription$.unsubscribe();
}


3 commentaires

Merci pour cette réponse! J'avais essayé cela à l'origine, mais l'événement de redimensionnement n'a pas détecté les changements de propriété clientWidth. Je ne suis pas sûr qu'il existe un événement JS pour détecter les modifications des propriétés DOM?


Merci! J'ai le ResizeObserver qui fait le travail maintenant. Désolé, vous ne voyez pas mon vote positif ... Je n'ai qu'une seule répétition, donc il ne montrera pas encore la mienne haha.


Salut @JuanDelaCruz! Avant que certaines des suggestions ci-dessous soient publiées, j'ai utilisé 'resize-observer' de NPM import {ResizeObserver} from 'resize-observer'; puis dans le code: import {ResizeObserver} from 'resize-observer'; `` `` // Observe this.myObserver = new ResizeObserver (entries => {// Faites quelque chose}); this.myObserver.observe (this.parent); `` Désolé pour le format des commentaires à ce sujet ... laissez-moi savoir si vous avez besoin de plus d'informations!



11
votes

J'ai eu le même problème parce que j'ai du tableau vide "types" dans mon fichier tsconfig. Résolu en ajoutant "resize-observer-browser" au tableau des types:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "typeRoots": ["node_modules/@types"],
    "types": ["resize-observer-browser"],
  }
}


2 commentaires

cela ne fonctionne pas pour moi. Je me suis littéralement cogné la tête pendant environ 2 heures juste pour que ça marche. Cependant, selon les versions actuelles, importez simplement ResizeObserver dans vos travaux de composants, import ResizeObserver from 'resize-observer-polyfill';


@saberprashant c'est exactement ma réponse, mais sans le code que vous devez utiliser, car il est évident comment utiliser la bibliothèque javascript dans TypeScript. Ajouté tout à l'heure.



7
votes

Je suggère d'utiliser resize-observer-polyfill, il a des types (dans le fichier d.ts) et si le navigateur prend en charge Resize Observer, il utilise simplement une implémentation native, mais il a un support plus large, car il utilise Mutation Observer comme solution de secours qui a un support beaucoup plus grand.

Alors utilisez simplement:

import ResizeObserver from 'resize-observer-polyfill';

Le navigateur prend en charge pour comparer:

comme vous pouvez le voir, Mutation Observer fonctionne même dans IE 11.


1 commentaires

tellement vrai. Désormais, resize-observer-polyfill prend entièrement en charge TS et fonctionne bien avec Angular, pour Chrome, Safari, Mozilla et même IE.



3
votes

Ajoutez simplement l'indicateur @ts-ignore . Cela rendra Typescript heureux à nouveau:

// @ts-ignore
const obs = new ResizeObserver(e => {
    // ...
});


0 commentaires

1
votes

J'ai eu le même problème dans React qui ne m'est arrivé que dans une version iOs spécifique (13.3), comme @saberprashant l'a mentionné, essayez de l'importer avec import ResizeObserver from 'resize-observer-polyfill'; même si votre IDE ne recommande pas cette importation.


0 commentaires

0
votes

Ajout de l' import '@types/resize-observer-browser'; réparé pour moi


0 commentaires