SlideShare a Scribd company logo
Observable и Computed
на пример KnockoutJS
1
Hello,
MoscowJS
29
2
Ну что,начнём?!
$(function () {
// ...
});
01.
02.
03.
3
А теперь пора?
if (document.readyState === 'complete') {
ready();
} else {
window.addEventListener('load', ready);
}
01.
02.
03.
04.
05.
4
1. Реактивное программирование
2. Observable и Сomputed
3. Заглянем под капот
4. Другие реализации
5
Реактивное
программирование
6
7
bit.ly/what-is-reactive
“I have no ... idea”
Erik Meijer
8
// 3
// Hello, World
var a = 1;
var b = 2;
var sum = a + b;
console.log(sum);
a = 'Hello, ';
b = 'World';
console.log(sum);
01.
02.
03.
04.
05.
06.
07.
9
10
11
Резюмируя
• Деклативно описывать поведение
• Автоматически обновлять зависимости
12
Observable и Computed
13
Observable
• Поддерживает чтение и запись
• Можно подписаться
14
// Create
// Write value
// Read value
var myObservable = ko.observable();
myObservable(42);
myObservable();
01.
02.
03.
04.
05.
06.
15
// 42
Подписка на изменения
var myObservable = ko.observable();
myObservable
.subscribe(value => console.log(value));
myObservable(42);
01.
02.
03.
16
Computed
• Вычисляется из зависимостей
• Поддерживает только чтение
• Можно подписаться
17
// Create
// Read value
// Subscribe to change
var myComputed = ko.computed(
() => myObservable() + 1
);
myComputed();
myComputed.subscribe(onChange);
01.
02.
03.
04.
05.
06.
07.
08.
18
a() b()
// 3
// Hello, 2
// Hello, World
var a = ko.observable(1);
var b = ko.observable(2);
var sum = ko.computed(() => + );
console.log(sum());
sum.subscribe(value => console.log(value));
a('Hello, ');
b('World');
01.
02.
03.
04.
05.
06.
07.
19
20
Задача
• Выводить список операций
• Обновлять его по таймеру
21
22
key
insert
update
Хранение данных
view.operations = ko.collection({
: data => data.id,
: data => new Operation(data),
: (item, data) => item.data(data)
});
01.
02.
03.
04.
05.
23
Операция
function Operation(data) {
var view = this;
view.id = data.id;
view.data = ko.observable(data);
view.progress = ko.computed(() => {
return view.data().progress;
};
}
01.
02.
03.
04.
05.
06.
07.
08.
24
Получение данных
get('/operations')
.then(data => view.operations(data));
01.
02.
25
Ещё
• Добавить сортировку
26
27
view.operation() view.sort()
Хранение данных
view.sort = ko.observable('id');
view.columns = {
id: item => item.id,
progress: item => item.progress()
}
view.sortedOperations = ko.computed(() => {
return sort( , );
});
01.
02.
03.
04.
05.
06.
07.
08.
28
Ещё
• Добавить фильтр по id
29
30
view.sortedOperation()
view.filter()
Хранение данных
view.filter = ko.observable('');
view.filteredOperations = ko.computed(() => {
return filter(
,
);
});
01.
02.
03.
04.
05.
06.
07.
31
XHR
operations sortedOp filteredOp
sort filter
DOM
32
33
Заглянем под капот
34
a()
Пример
var a = ko.observable();
var b = ko.computed(() => + 1);
01.
02.
35
Подписка
var a = ko.observable();
a.subscribe(value => console.log(value));
----> a._subscribers.push({ callback: callback });
01.
02.
36
Оповещение
a(42);
----> a._notifySubscribers();
----> a._subscribers[0].callback(); // 42
37
Вычислительный контекст
• Стек из контекстов
• Регистрация в контексте
38
Чтение и регистрация
a();
----> ko._context.register(a);
39
Создание контекста
var b = ko.computed(() => a() + 1;);
----> ko._context.create(b);
----> b._evaluate();
----> ko._context.register(a);
----> a.subscribe(() => b._evaluate(););
----> ko._context.remove();
40
Создание computed
1. Вызываем конструктор Computed
2. Computed создаёт контекст
3. Knockout вычисляет Computed
4. Computed подписывается на зависимости
5. Computed удаляет вычислительный контекст
41
Другие реализации
42
Reactive Extentions
• Пример bit.ly/rx-example
• Доклад bit.ly/rx-talk
43
Elm
• Пример bit.ly/elm-example
• Доклад bit.ly/elm-talk
44
Спасибо за внимание. Вопросы?
• Оля Кобец, Яндекс
• Twitter @homyasusina
• Пример bit.ly/ko-example
• Слайды bit.ly/homyasusina-talk
45

More Related Content

PDF
Сергей Константинов — Простая обработка групп геообъектов на карте
PPTX
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
PDF
iOS-05_2-UIKit
PDF
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
PDF
Кастомная кнопка: взгляд изнутри
PDF
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
PDF
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
PDF
Алексей Распопов "Будущее асинхронного программирования в ECMAScript"
Сергей Константинов — Простая обработка групп геообъектов на карте
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
iOS-05_2-UIKit
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
Алексей Распопов "Будущее асинхронного программирования в ECMAScript"

What's hot (6)

PPTX
Коротко о React.js
PPTX
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
PPTX
Дуров Р. - Cocos2d
PDF
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
PDF
ReactiveUI: Rx + MVVM
PPTX
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Коротко о React.js
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Дуров Р. - Cocos2d
"FRP — делаем жизнь проще", Трдат Мкртчян, MoscowJS 19
ReactiveUI: Rx + MVVM
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Ad

Viewers also liked (7)

PPTX
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
PDF
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
PDF
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
PDF
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
PDF
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
PDF
Виктор Розаев - Как не сломать обратную совместимость в Public API
PDF
Как мы общаемся с пользователями на 46 языках и понимаем друг друга
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
Виктор Розаев - Как не сломать обратную совместимость в Public API
Как мы общаемся с пользователями на 46 языках и понимаем друг друга
Ad

More from MoscowJS (20)

PDF
Александр Русаков - TypeScript 2 in action
PDF
Favicon на стероидах
PDF
E2E-тестирование мобильных приложений
PDF
Reliable DOM testing with browser-monkey
PDF
Basis.js - Production Ready SPA Framework
PDF
Контекст в React, Николай Надоричев, MoscowJS 31
PDF
Верстка Canvas, Алексей Охрименко, MoscowJS 31
PDF
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
PDF
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
PDF
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
PDF
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
PDF
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
PDF
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
PDF
"Доклад не про React", Антон Виноградов, MoscowJS 27
PDF
"Web Audio Api", Анатолий Найда, MoscowJS 27
PDF
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
PDF
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
PDF
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
PDF
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
PDF
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
Александр Русаков - TypeScript 2 in action
Favicon на стероидах
E2E-тестирование мобильных приложений
Reliable DOM testing with browser-monkey
Basis.js - Production Ready SPA Framework
Контекст в React, Николай Надоричев, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Изоморфный D3 + MALEVICH", Алексей Охрименко, MoscowJS 25
"HTML5 Cache Manifest на практике", Дмитрий Головин, MoscowJS 25
"Подход к написанию безопасного клиентского кода на примере React", Иван Елки...
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24

"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29