Проблемы переопределения геттеров в контроллере (3.0.0)

У меня есть этот код в инициализаторе, он пытается переопределить геттер для allAdminRoutes:

    api.modifyClass('controller:admin-plugins', {
      pluginId: PLUGIN_ID,

      get allAdminRoutes() {
        return this.model
          .filter((p) => p?.enabled)
          .map((p) => {
            return p.admin_route;
          })
          .filter(Boolean);
      },
    });

Это приводит к ошибке:

TypeError: this.model is undefined

Меня бы это не сильно беспокоило, но это просто исходный код геттера (я даже ещё ничего не менял!)

Чего я не понимаю? Переопределение геттера таким образом как-то не поддерживается или это вызывает проблемы с областью видимости?

4 лайка

Странно, но в последней версии этой проблемы, похоже, нет. (Это был лишь тест на Production.)

Попробую воспроизвести на чистой версии 3.0.0 Stable.

1 лайк

Пример должен работать, и мне не известно о каких-либо значимых изменениях между стабильным релизом и текущей версией. Дайте нам знать, если вам удастся воспроизвести проблему!

1 лайк

Спасибо, Дэвид. Сделаю. Да, я это заметил. Сейчас мяч точно на моей стороне, так как среда, в которой я столкнулся с этой проблемой, была не полностью чистой.

1 лайк

OK Дэвид, похоже (и это странно):

  • работает в Production
  • не работает в Development начиная с версии 3.0.0 (возможно, и раньше)
  • Я тестировал как на чистом Dev-окружении без Docker, так и на очень чистом (но, возможно, с неполной конфигурацией) специальном Docker Dev-окружении.

Вот ошибки:

Произошла ошибка:

- При рендеринге:
  - top-level
    application
      discourse-root
        sidebar-wrapper
          admin
            admin-wrapper
              nav-item
                link-to
                  -link-to
Uncaught (in promise) TypeError: При генерации ссылки на маршрут "adminPlugins": this.model не определен
    get allAdminRoutes admin-plugins.js:20

Обратите внимание: я могу поставить оператор debugger перед return this.model, но он никогда не срабатывает.

@RGJ также любезно посмотрел на это и смог воспроизвести эту проблему.

Это довольно серьёзная проблема, так как очевидно, что нам нужно разрабатывать функционал до его выкладки в продакшн… но я не должен вам об этом напоминать! :sweat_smile: Также немного раздражает, что проблема возникает на Stable-версии…

Пока переместил в bug

2 лайка

Хорошо, мы ещё больше уверены, что здесь есть проблема… так как mergeMixins упоминается в трассировке стека

https://github.com/emberjs/ember.js/issues/18860

(спасибо @RGJ за то, что нашёл это)

4 лайка

Отличная работа — спасибо @merefield и @RGJ.

Не уверен, сколько мы можем сделать для исправления этого в самом Discourse — как вы отметили, проблема, похоже, находится выше по потоку, в Ember. Возможно, мы сможем исправить проблемный метод :thinking:

Чтобы начать работу, я добавил минимальный тестовый случай, который приводит к ошибке, чтобы мы могли отслеживать прогресс. В тесте есть комментарии, объясняющие, почему проблема вызывается нашей системой modifyClass:

https://github.com/discourse/discourse/pull/19911

4 лайка

Да, спасибо и вам за старания. Странно, что они оставили эту проблему без внимания. Знаем ли мы, исправит ли это (Ember) 4.x?

К сожалению, похоже, что проблема всё ещё существует в Ember 4.x :cry:

1 лайк

Парадоксально, но это, похоже, единственное продвижение в проекте Ember в рамках связанного PR, который всё ещё находится в статусе черновика. Неужели всё, что требуется, — это вежливая просьба выделить приоритет, когда появится возможность?:

https://github.com/emberjs/ember.js/pull/20129

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

Стоит ли создать отдельную тему в GitHub - emberjs/ember.js: Ember.js - A JavaScript framework for creating ambitious web applications · GitHub, сославшись на этот PR, эту дискуссию и ваш тест?

Да, мой тест основан на ихнем (но с использованием специфичного для Discourse API api.modifyClass). Я не думаю, что нам стоит открывать новый тикет — это на 100% то же самое, что и уже открытый. Посмотрим, сможем ли мы что-то сделать, чтобы ускорить его рассмотрение.

3 лайка

Здесь есть некоторые успехи — у нас уже открыт PR с исправлением по адресу [BUGFIX LTS] Don't run getters while applying mixins by wycats · Pull Request #20388 · emberjs/ember.js · GitHub

Как только он будет принят и перенесён в Ember 3.28, мы постараемся как можно скорее применить его в Discourse

3 лайка

Перенесено обратно?! Я как раз об этом думал, отличные новости!

Спасибо за руководство этим процессом, Дэвид!

Это исправление уже выпущено в составе Ember 3.28.12, и мы обновили Discourse, чтобы использовать его. Пожалуйста, сообщите нам, если вы всё ещё сталкиваетесь с проблемами при использовании modifyClass после обновления до последней версии Discourse.

6 лайков

Отлично, Дэвид, большое спасибо!

2 лайка

Эта тема была автоматически закрыта через 9 дней. Новые ответы больше не принимаются.