- PVSM.RU - https://www.pvsm.ru -

Что нового в Marionette.js 3.0?

Что нового в Marionette.js 3.0? - 1

Прошло более 2-х лет с того времени как 3-я версия начала разрабатываться и вот наконец-то сегодня она была зарелизена! Итак, кому интересно, кто ждал и работает с Marionette.js [1] — добро пожаловать в подкат.
Ребята с кор команды очень хорошо поработали и добавили парочку хороших изменений.
Давайте начнем.

View

Marionette.View заметно преобразовалось. Теперь это не просто неспользуемый класс, как мы помним из документации [2] версии 2

Note: The Marionette.View class is not intended to be used directly

а полноценная View.

Более того, она теперь содержит в себе и Marionette.View, и Marionette.ItemView и Marionette.LayoutView. Да, как вы поняли теперь у нас больше нет ни Marionette.ItemView ни Marionette.LayoutView, они были удалены. Для того чтобы использовать 3-ю версию в коде нужно лишь заменить ваши Marionette.ItemView и Marionette.LayoutView на Marionette.View и все.

Давайте рассмотрим небольшой примерчик:

import Mn from 'backbone.marionette';

const MyView = Mn.View.extend({
  template: _.template('<h1>Превый заголовок для 3-й версии</h1>'),

  onRender() {
    console.log('Моя вью была отрендерена')
  }
});

Живой пример [3]

И пример как использовать View в качестве LayoutView

import Mn from 'backbone.marionette';

const MyView = Mn.View.extend({
  regions: {
    region1:'#region1',
    region2: '#region2'
  },
  onRender() {
    this.showChildView('region1', childView1);
    this.showChildView('region2', childView2);
  }
});

Живой пример [4]

С этим разобрались. Идем дальше.

CompositeView

Marionette.CompositeView стала deprecated что вызывает сразу множество вопросов. Как мне теперь создать табличку [5] или деревовидное меню [6] как это было рекомендовано в документации? Все очень просто, для этого нужно использовать Marionette.View и Marionette.CollectionView. Ребята приготовили хорошие сравнительные примеры как для таблиц [7] так и для деревовидных меню [8].

Кстати, документация для новой версии заметно улучшилась. Над ней хорошо поработал Scott Walton [9], он же автор Marionette Guides [10].

CollectionView

Marionette.CollectionView осталось в основном без изменений. Методы getChildView и getEmptyView были удалены. Вместо этого можно делать так

Mn.CollectionView({
  childView() {
    // мой код
  },
  emptyView() {
    // мой код
  }
});

Так же, Backbone.BabySitter удален из зависимостей и полностью интегрирован в ядро фреймворка. Теперь давайте просто освежим память небольшим примерчиком.

import Mn from 'backbone.marionette';

const data = [
  {
    item: 'Превая запись'
  },
  {
    item: 'Вторая запись'
  },
  {
    item: 'Третья запись'
  }
];
const collection = new Backbone.Collection(data);
const childViewTemplate = _.template('<%= item %>');

const ChildView = Mn.View.extend({
  template: childViewTemplate
});

const collectionView = new Mn.CollectionView({
  el: 'body',
  childView: ChildView,
  collection: collection
});

collectionView.render();

Живой пример [11]

View.Events

Жизненный цикл View претерпел изменений. События before:show и show были удалены. Теперь он выглядит так:

before:render -> render -> before:attach -> attach -> dome:refresh

before:detach -> detach -> before:destroy -> destroy

Пример

import Mn from 'backbone.marionette';

const MyView = Mn.View.extend({
  template: false,
  onBeforeRender() {
    console.log(1)
  },
  onRender() {
    console.log(2)
  },
  onbeforeDestroy() {
    console.log(3)
  },
  onDestroy() {
    console.log(4);
  }
});

const myView = new MyView();
myView.render();
myView.destroy();

Живой пример [12]

ChildView Events

API немного изменилось и теперь вместо childEvents нужно использовать childViewEvents.

import Mn from 'backbone.marionette';

const MyView = Mn.View.extend({
  childViewEvents: {
    'some:event': 'eventHandler'
  }
  eventHandler() {
    console.log('Событие дочернего елемента');
  }
});

Живой пример [13]

Templates

templateHelpers был переименован в templateContext.

import Mn from 'backbone.marionette';

const MyView = Mn.View.extend({
  template: template,
  templateContext() {
    return {
      version: '3.0'
    }
  }
});

Живой пример [14]

Backbone.Radio

На смену Backbone.Wreqr пришел Backbone.Radio [15] — мощная библиотека для общения между модулями в приложении.
Backbone.Radio плотно интегрирован в Marionette.Object что дает возможность слушать все события приложения в одном месте.

Живой пример [16]

Изменения в API

 - `bindEntityEvents` ->  `bindEvents`
 - `unbindEntityEvents ` -> `unbindEvents`
 - `normalizeUIString`, `normalizeUIKeys`, `normalizeUIValues` -> `normalizeMethods`
 - `proxyGetOption` -> `getOption`
 - `proxyBindEntityEvents` -> `bindEvents`
 - `proxyUnbindEntityEvents` -> `unbindEvents`

Что было удалено?

  • Marionette.Controller
  • Marionette.Module
  • Marionette.RegionManager

Переезд на новую версию должен быть не очень болезненным.
Вот коммиты одного из лидеров кор команды Paul Falgout [17] в один из своих проектов:

templateHelpers -> templateContext
Marionette.ItemView -> Marionette.View
Marionette.LayoutView -> Marionette.View
childEvents -> childViewEvents
render:collection / onRenderCollection -> render:children / onRenderChildren
before:show / show / onBeforeShow / onShow -> attach etc

Чтобы облегчить жизнь разработчикам, была создана баблиотека marionette-v3-compat [18].
Так же есть примеры третьей версии [19] с разными сборщиками проектов.

Marionette.js github репозиторий [1]

Автор: denar90

Источник [20]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/177791

Ссылки в тексте:

[1] Marionette.js: https://github.com/marionettejs/backbone.marionette

[2] документации: http://marionettejs.com/docs/v2.4.7/marionette.view.html#marionetteview

[3] Живой пример: https://jsfiddle.net/denar90/c5ssn99r/

[4] Живой пример: https://jsfiddle.net/denar90/uwzdp2sr/

[5] табличку: http://marionettejs.com/docs/v2.4.7/marionette.compositeview.html#compositeviews-childviewcontainer

[6] деревовидное меню: http://marionettejs.com/docs/v2.4.7/marionette.compositeview.html#example-usage-tree-view

[7] таблиц: http://marionettejs.com/docs/v3.0.0-pre.5/marionette.collectionview.html#rendering-tables

[8] деревовидных меню: http://marionettejs.com/docs/v3.0.0-pre.5/marionette.collectionview.html#rendering-trees

[9] Scott Walton: https://github.com/scott-w

[10] Marionette Guides: https://www.gitbook.com/book/marionette/marionette-guides/details

[11] Живой пример: https://jsfiddle.net/denar90/ardw0hkt/

[12] Живой пример: https://jsfiddle.net/denar90/kmj84yLc/

[13] Живой пример: https://jsfiddle.net/denar90/baLxotkk/

[14] Живой пример: https://jsfiddle.net/denar90/du1nfv7v/

[15] Backbone.Radio: https://github.com/marionettejs/backbone.radio

[16] Живой пример: https://jsfiddle.net/denar90/Lhuprobv/

[17] Paul Falgout: https://github.com/paulfalgout

[18] marionette-v3-compat: https://github.com/marionettejs/marionette-v3-compat

[19] примеры третьей версии: https://github.com/marionettejs/marionette-integrations

[20] Источник: https://habrahabr.ru/post/308138/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best