Как переопределить/проксировать disabledCallback в пользовательских веб-компонентах

Я пытаюсь проксировать disconnectedCallback любого экземпляра пользовательского элемента. Вот урезанная версия попытки сделать это:

const template = document.createElement("template");
template.innerHTML = `<button id = "button">Click ME</button>`;

customElements.define("custom-test", class extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: "open" });
      this.shadowRoot.appendChild(template.content.cloneNode(true));
    }

    disconnectedCallback() {
      console.info("Disconnected Callback")
    }
  },
);

let test = document.createElement('custom-test')
test = (function () {
  const fn = test.disconnectedCallback;
  test.disconnectedCallback = function () {
    console.info("proxy function")
    fn.apply(test)
  }
  return test;
})()

document.body.appendChild(test)

const div = document.createElement('div');
div.appendChild(test);
// Only outputs "Disconnected Callback"

Я ожидаю увидеть следующий вывод в консоли:

proxy function
Disconnected Callback

Но я вижу только вторую строку, игнорируя функцию прокси. Что мне нужно сделать, чтобы переопределить функцию?

Я пытался использовать метод new Proxy, но не могу этого сделать, потому что создаваемый им элемент Proxy нельзя использовать в методе appendChild.

Если я явно вызову disconnectedCallback элемент

test.disconnectedCallback()
// Outputs the proxy function too

он вызывает прокси, как в последней строке, он вызывает прокси.

Почему вы хотите проксировать его? Ваш disconnectedCallback выполняется по умолчанию

Danny '365CSI' Engelman 08.12.2022 16:26

@Danny'365CSI'Engelman Я пишу фреймворк и хочу заблокировать disconnectedCallback работу в определенном экземпляре appendChild, где я перемещаю элемент из одного раздела в другой пользовательского макета. Я не уверен, что вы подразумеваете под «Ваш отключенный обратный вызов выполняется по умолчанию», каждая операция узла, которую я вижу, игнорирует ее.

mattematt 08.12.2022 16:31

Тогда что произойдет, когда я это сделаю extends customElements.get("custom-test")

Danny '365CSI' Engelman 08.12.2022 16:39

@ Danny'365CSI'Engelman вы получите стандартный конструктор класса без прокси. Что хорошо в моем случае использования - я пытаюсь расширить метод для конкретного экземпляра, а не для всего класса.

mattematt 08.12.2022 16:51

«Я пытаюсь проксировать disabledCallback любого экземпляра пользовательского элемента». - не. Вместо этого просто запустите событие и подпишитесь test.onDisconnect = () => console.info("proxy");.

Bergi 08.12.2022 18:48

@Bergi, к сожалению, это не сработает в моем случае использования, потому что я хочу заблокировать запуск disconnectedCallback в определенных случаях, что невозможно, как вы описываете. Я могу посмотреть и посмотреть, могу ли я использовать события по-другому, чтобы добиться этого.

mattematt 09.12.2022 11:33

О, я вижу, тогда, вероятно, лучше сделать <custom-test ignore-moves />, где размещение атрибута говорит компоненту, что он не мешает тому, что вам нужно сделать. Но в любом случае я считаю хорошей практикой, чтобы компонент знал, что (не) происходит, вместо того, чтобы пытаться обернуть/проксировать/украсить его.

Bergi 09.12.2022 18:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Изучив это больше, я не думаю, что это возможно. Проблема в том, что функции, определенные в классе, такие как disconnectedCallback, определены в прототипе объекта и не могут быть переопределены таким же образом (и если есть способ, вы, вероятно, не должны этого делать).

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

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

Упрощение символов дробей единиц: неправильные результаты
Я разрабатываю игру с мячом. я застрял на я хочу, чтобы 3 мяча двигались сверху вниз, но каждый раз со случайной шириной
Я ничего не делаю, это исправить эту ошибку: «Несовместимые типы. Найдено:« Автомобиль », требуется:« java.lang.Object »», полный код ниже, и любая помощь приветствуется
Цикл для игры, которая проверяет, является ли ход допустимым или нет
PowerQuery: функция для получения информации о дубликатах для заданных имен столбцов
Введите аннотацию — хотите ввести фактическое строковое значение, а не целое число, когда просите пользователя ввести свое имя
Создать функцию Count в R
Передача массива структур и обновление массива в C++
Параметр функции Postgres имеет значение null, затем замените его значением по умолчанию
Создайте функцию для получения сводной статистики кадра данных в R