21. LibreOffice Impress
Что такое MV*?
Модель презентации
Модель слайда
Модель элемента слайда
Панель слайдов
Диалог свойств слайда
Данные Представление
Редактор слайда
Представление элемента
Просмотрщик слайдов
22. LibreOffice Impress
Что такое MV*?
Модель презентации
Модель слайда
Модель элемента слайда
Панель слайдов
Редактор слайда
Представление элемента
Просмотрщик слайдов
Диалог свойств слайда
Данные Представление
23. LibreOffice Impress
Что такое MV*?
Модель презентации
Модель слайда
Модель элемента слайда
Панель слайдов
Редактор слайда
Представление элемента
Просмотрщик слайдов
Диалог свойств слайда
Данные Представление
События
События
События
24. Когда стоит использовать
клиентские MV*-фреймворки?
● Крупное приложение с большим
количеством взаимосвязанных сущностей
● Есть сущности, имеющие большое
количество представлений одновременно
● В команде достаточно матерых JavaScript-
разработчиков
25. Когда не стоит использовать
клиентские MV*-фреймворки?
● В команде мало хороших JavaScript-
разработчиков
● Страница должна грамотно парситься
поисковыми роботами и аналитическими
системами
● Вам нужна хорошая скорость работы
сайта (jWidget – исключение!)
29. Классы и объекты
На базе популярной библиотеки
John'а Resig'а “Simple JavaScript inheritance”.
http://ejohn.org/blog/simple-javascript-inheritance/
30. Классы и объекты
Система агрегации объектов.
var Soldier = function() {
Soldier._super.call(this);
this.leftHand = this.own(new Hand("left"));
this.rightHand = this.own(new Hand("right"));
};
JW.extend(Soldier, JW.Class);
var soldier = new Soldier();
soldier.destroy();
// руки уничтожены тоже
32. События
Нет никаких Observable. Есть Event.
this.titleChangeEvent = this.own(new JW.Event());
this.titleChangeEvent.trigger(
new JW.ValueEventParams(this, title));
this.own(obj.titleChangeEvent.bind(
this._onTitleChange, this))
Подписка.
35. Свойства
Автоматическое дублирование.
source target1 target2
var source = new JW.Property("apple");
var target1 = new JW.Property();
target1.bindTo(source);
var target2 = new JW.Property();
target2.bindTo(target1);
source.set("banana");
// target2.get() === "banana"
36. Свойства
Функтор формирует свойство по формуле.
target '{value} {unit}'
JW.Functor
target == '1000 MW' value == 1000, unit == 'MW'
target == '1500 МВ' value == 1500, unit == 'МВ'
37. Свойства
Функтор формирует свойство по формуле.
target '{value} {unit}'
var target = new JW.Functor(
[ value, unit ],
function(value, unit) {
return value + " " + unit;
},
this
).target;
JW.Functor
40. Свойства
Можно осуществлять Data binding.
var el = $("#document");
this.own(new JW.UI.ClassUpdater(
el, "my-selected", selected));
this.own(new JW.UI.TextUpdater(el, name));
this.own(new JW.UI.ValueUpdater(el, name));
this.own(new JW.UI.ValueListener(el, name));
И двусторонний Data binding.
41. Свойства
Можно налету менять локализацию.
var printText = this.own(locale.getFunctor("print")).target;
this.own(new JW.UI.TextUpdater(el, printText));
42. Структура фреймворка
1. Классы и объекты (JW.Class)
2. События (JW.Event)
3. Свойства (JW.Property)
4. Коллекции (JW.AbstractCollection)
49. Коллекции
Конвертер элементов (Mapper)
target[i] function(source[i])
var mapper = dataCollection.createMapper({
createItem: function(data) {
return new View(this, data);
},
destroyItem: JW.destroy,
scope: this
});
var viewCollection = mapper.target;
50. Коллекции
Конвертер элементов (Mapper)
target[i] function(source[i])
var mapper = dataCollection.createMapper({
createItem: function(data) {
return new View(this, data);
},
destroyItem: JW.destroy,
scope: this
});
var viewCollection = mapper.target;
51. Коллекции
Конвертер элементов (Mapper)
target[i] function(source[i])
var source = new JW.ObservableArray([5]);
var target = source.createMapper({
createItem: function(item) { return 2 * item; }
});
console.log(target.get(0)); // 10
source.add(7);
console.log(target.get(1)); // 14
55. Коллекции
Другие синхронизаторы
4. Конвертер в массив (Orderer)
JW.Array target (в порядке доб.) source
5. Сортировщик (SorterComparing)
JW.Array target (sorted by f(x, y)) source
56. Коллекции
Другие синхронизаторы
4. Конвертер в массив (Orderer)
JW.Array target (в порядке доб.) source
5. Сортировщик (SorterComparing)
JW.Array target (sorted by f(x, y)) source
6. Объединитель массивов (Merger)
target source1 … sourceN
60. Структура фреймворка
1. Классы и объекты (JW.Class)
2. События (JW.Event)
3. Свойства (JW.Property)
4. Коллекции (JW.AbstractCollection)
True
61. Структура фреймворка
1. Классы и объекты (JW.Class)
2. События (JW.Event)
3. Свойства (JW.Property)
4. Коллекции (JW.AbstractCollection)
5. Компоненты (JW.UI.Component)
62. Структура фреймворка
1. Классы и объекты (JW.Class)
2. События (JW.Event)
3. Свойства (JW.Property)
4. Коллекции (JW.AbstractCollection)
5. Компоненты (JW.UI.Component) ReactJS
68. Компоненты
Как это возможно?
● Каждый HTML-шаблон рендерится только
один раз
● После этого каждый новый компонент
получается клонированием отрендеренного
фрагмента
● Шаблон рендерится
напрямую браузером, без
всякого препроцессинга
● Никаких селекторов
75. Компоненты
JW.UI.Component vs ReactJS (TBD)
● Совместим с jQuery
● Можно создавать поверх
существующего DOM
● Прозрачнее
● Дает полный контроль
над компонентами
и DOM
● Ниже порог входа
(проще на старте)
● Код проще
● Большое сообщество
разработчиков
76. Структура фреймворка
1. Классы и объекты (JW.Class)
2. События (JW.Event)
3. Свойства (JW.Property)
4. Коллекции (JW.AbstractCollection)
5. Компоненты (JW.UI.Component)
6. Система сборки (jWidget SDK)
78. Система сборки
Standalone проект
jWidget SDK
https://github.com/enepomnyaschih/jwsdk
Является прямой альтернативой GruntJS,
и посему планируется заменить
jWidget SDK плагином к GruntJS
87. Система сборки
Выполняются оптимизации:
● Объединение и минимизация JS
● Параметр timestamp для браузерного
кэширования
● Конвертирование малых изображений и
шрифтов в base64 Data URI
88. Система сборки
Выполняются оптимизации:
● Объединение и минимизация JS
● Параметр timestamp для браузерного
кэширования
● Конвертирование малых изображений и
шрифтов в base64 Data URI
● Поддержка динамической загрузки пакетов
по требованию
89. Совместимость jWidget с другими
библиотеками и фреймворками
● Весь функционал размещен в отдельном
пространстве имен JW
90. Совместимость jWidget с другими
библиотеками и фреймворками
● Весь функционал размещен в отдельном
пространстве имен JW
● UI-слой работает на базе jQuery
91. Совместимость jWidget с другими
библиотеками и фреймворками
● Весь функционал размещен в отдельном
пространстве имен JW
● UI-слой работает на базе jQuery
● Разрабатываются адаптеры между моделью
jWidget и UI-слоями других фреймворков
(например, ReactJS и ExtJS)
93. Вопросы?
FAQ
● jWidget – почему так называется?
Потому что гладиолус
● Много ли пользователей у jWidget?
Пока нет
● Почему ООП-подход так важен?
Легко переносится на Dart и пр. платформы
● Есть ли готовая библиотека визуальных
компонентов?
Нет. Но легко совмещается с jQuery UI