Является ли публикация / подписка на события после рендеринга пользовательского интерфейса лучшей практикой независимо от структуры? - PullRequest
6 голосов
/ 17 ноября 2011

Я унаследовал довольно большую базу кода Javascript / ExtJS3, и есть много случаев вызова событий внутри переопределенного метода initComponent после вызова «... superclass.initComponent.apply (this, arguments)»,Определенные события вызываются для определенных объектов следующим образом:

this.filter.on('filterUpdated', function(filter, params)

Я начал преобразовывать код для использования парадигмы pub / sub, чтобы уменьшить связь между объектами и их конкретнымиИмена событий, но быстро сталкивались с проблемами при публикации и / или подписке на события внутри initComponent (который в ExtJS выполняется перед рендерингом).Мне нужно вызвать событие "INIT" из компонента самого высокого уровня, когда экран загружается впервые, и я либо получаю ошибку (из-за того, что ExtJS-шаблоны не были обработаны, как оказалось), либо события вообще не запускаются.

Затем я прочитал следующее в источнике ExtJS для Ext.Component (из которого выходят все компоненты), и у меня был момент "ага":

    if (this.tpl) {
        if (!this.tpl.compile) {
            this.tpl = new Ext.XTemplate(this.tpl);
        }
        if (this.data) {
            this.tpl[this.tplWriteMode](contentTarget, this.data);
            delete this.data;
        }
    }
    this.afterRender(this.container);

Когда я переключился на обаПубликуя событие «INIT» из метода afterRender моего верхнего компонента и подписываясь на все события от всех других компонентов из их методов afterRender, все работало, как я ожидал.И теперь мне просто интересно, во многом, чтобы проверить мой дизайн ...

Это общепринятый способ реализации pub / sub в пользовательском интерфейсе, управляемом событиями?Независимо от рамок даже?А именно, являются ли следующие 2 хорошими принципами или их другие способы?

  1. «События инициализации» должны публиковаться после того, как все подкомпоненты будут обработаны
  2. Все подкомпоненты должны подписаться на все события (чтобы быть в безопасности) после того, как они рендерились

Заранее спасибо

1 Ответ

0 голосов
/ 21 ноября 2011

Вы должны сбалансировать накладные расходы на обработку событий и возможность пропустить значимые события. В js / DOM состояние земли изменчиво.

Для вашего # 1, если вы можете определить момент времени, когда все ваши подкомпоненты были обработаны и подписаны, имеет смысл запустить событие init.

Для # 2 кажется безопасным, чтобы все слушали события; Однако это может замедлить ход событий. Если проблемы с производительностью очевидны, вам, возможно, придется решить, какие события вас не волнуют, и избегать подписки.

...