CDK материала, прикрепляющий фон к уже открытому наложению

Можно ли прикрепить фон к открытому наложению? Я ищу что-то противоположное функции .detachBackdrop().

В конфигурации наложения я хочу оставить hasBackdrop отрицательным и добавить его позже, когда пользователь начнет взаимодействовать с прикрепленным компонентом наложения.

Спасибо за любую идею🙂

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не кажется так.

Но вы можете изначально добавить фон, но добавить CSS, чтобы он был прозрачным и pointer-events: none чтобы предотвратить любые действия пользователя, такие как клики. А затем просто переключите имя класса или что-то еще, что переведет ваш фон в режим по умолчанию с включенными событиями указателя и цветом фона.

Ответ принят как подходящий

Мне удалось добавить функцию attachBackdrop(), расширив класс OverlayRef по умолчанию и создав его на основе частного метода _attachBackdrop():

import { OverlayConfig, OverlayKeyboardDispatcher, OverlayOutsideClickDispatcher, OverlayRef } from "@angular/cdk/overlay";
import { PortalOutlet } from "@angular/cdk/portal";
import { EnvironmentInjector, Injectable, NgZone } from "@angular/core";
import { Location } from "@angular/common";

export type ImmutableObject<T> = {
    readonly [P in keyof T]: T[P];
};

export class DynamicOverlayRef extends OverlayRef {

    constructor(
        _portalOutlet: PortalOutlet,
        _host: HTMLElement,
        _pane: HTMLElement,
        _config: ImmutableObject<OverlayConfig>,
        _ngZone: NgZone,
        _keyboardDispatcher: OverlayKeyboardDispatcher,
        _document: Document,
        _location: Location,
        _outsideClickDispatcher: OverlayOutsideClickDispatcher,
        _animationsDisabled = false,
        _injector: EnvironmentInjector,
      ) {
        super( 
            _portalOutlet,
            _host,
            _pane,
            _config,
            _ngZone,
            _keyboardDispatcher,
            _document,
            _location,
            _outsideClickDispatcher,
            // _animationsDisabled,
            // _injector
          );
    }

    public attachBackdrop() {
        const showingClass = 'cdk-overlay-backdrop-showing';
    
        this["_backdropElement"] = this["_document"].createElement('div');
        this["_backdropElement"].classList.add('cdk-overlay-backdrop');
    
        if (this["_animationsDisabled"]) {
          this["_backdropElement"].classList.add('cdk-overlay-backdrop-noop-animation');
        }
    
        if (this["_config.backdropClass"]) {
          this["_toggleClasses"](this["_backdropElement"], this["_config.backdropClass"], true);
        }
    
        // Insert the backdrop before the pane in the DOM order,
        // in order to handle stacked overlays properly.
        this["_host"].parentElement!.insertBefore(this["_backdropElement"], this["_host"]);
    
        // Forward backdrop clicks such that the consumer of the overlay can perform whatever
        // action desired when such a click occurs (usually closing the overlay).
        this["_backdropElement"].addEventListener('click', this["_backdropClickHandler"]);
    
        // Add class to fade-in the backdrop after one frame.
        if (!this["_animationsDisabled"] && typeof requestAnimationFrame !== 'undefined') {
          this["_ngZone"].runOutsideAngular(() => {
            requestAnimationFrame(() => {
              if (this["_backdropElement"]) {
                this["_backdropElement"].classList.add(showingClass);
              }
            });
          });
        } else {
            this["_backdropElement"].classList.add(showingClass);
        }
      }
  
}

Это создает проблему с добавлением пользовательского класса фона с использованием свойства backdropClass во время настройки наложения, но ее можно легко решить, например. добавление параметра в этот метод attachBackdrop().

Если нет необходимости добавлять собственный код для прикрепления функции, его можно сократить до:

public attachBackdrop() {
    this["_attachBackdrop"]();
}

Другие вопросы по теме