bepack
@bepack
Погружаюсь в мир JavaScript

Как правильнее назначить обработчики события в MVC?

Пытаюсь перенести понимание MVC и прочих шаблонов проектирования из PHP в JavaScript

И так, мне нужно в View создать элементы и назначить им обработчики, обрабатывать будет Controller, НО

Все 3 компонента (Model, View, Controller) должны быть полностью изолированы и ничего не знать друг о друге, как тогда назначать обработчик?

Варианты:
  1. Передать в View контекст (ссылку) на Controller
  2. Из Controller передать ссылки на функции в View


Подскажите пожалуйста, правильная ли схема?

1 вариант
class View{
 // из контроллера передаю view.setContext(this)
  setContext(context){
     this._controller = context;
  }

  render(){
      const btn = document.createElement('button');
      btn.textContent('CLICK ME');
      btn.addEventListener('click', () => this._controller.increaseCounter() );  
  }
// ...
 }
2 вариант
// в контроллере/клиентском коде передать в View.increaseFunction функцию Controller.increaseFunction

 class View{
 // ...
 
  render(){
      const btn = document.createElement('button');
      btn.textContent('CLICK ME');
      btn.addEventListener('click', this.increaseFunction );  
  }
// ...
 }

НО этот вариант мне кажется жуть каким костыльным


Еще, я понимаю что все части должны быть изолированы, НО все же, не лучше ли в контроллере получить данные из модели, и уже передать их на рендеринг в View, как это делается в каком-нибудь Laravel / Yii

Где могу найти адекватные примеры шаблонов на js ?
  • Вопрос задан
  • 198 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ksnk
Начнем с того, что серверное web приложение и клиентское - они работают в разных условиях и решают разные задачи.
Серверное - одна точка входа, как правило, текст запроса - текстовое значение, полное управление этой точкой находится у контроллера. Контроллер разруливает прилетевший запрос и либо вызывает дочерние контроллеры или сразу выковыривает данные с помощью моделей и отдает их во view.
Клиентское приложение имеет КУЧУ точек входа - любой поставленный обработчик событий. Тоесть сначала , если вы настолько любите и уважаете MVC, придется собирать все обработчики в кучу и отдать какому-то контроллеру-роутеру. Тоесть, вместо того, чтобы по клику на элементе тупенько стартовать анимацию на jQuery, приходится кодировать клик в событие, отдавать его контроллеру и ожидать оттуда коллбяк тебе же самому, так как никто не сможет дернуть анимацию кроме тебя... Этот колбяк будет скромно называться рендерингом... :) Не, конечно, в этом подходе тоже есть достаточно очень вкусных фенек, но imho, MVC для клиентского приложения это дань моде и чисто распальцовка...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы