"observable и computed на пример knockoutjs", Ольга Кобец, moscowjs 29

45
Observable и Computed на пример KnockoutJS 1

Upload: moscowjs

Post on 16-Apr-2017

376 views

Category:

Software


2 download

TRANSCRIPT

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

Observable и Computed на пример KnockoutJS

1

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

Hello, MoscowJS29

2

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

Ну что, начнём?!$(function () {

// ...

});

01.

02.

03.

3

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

А теперь пора?if (document.readyState === 'complete') {

ready();

} else {

window.addEventListener('load', ready);

}

01.

02.

03.

04.

05.

4

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

1. Реактивное программирование

2. Observable и Сomputed

3. Заглянем под капот

4. Другие реализации

5

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

Реактивноепрограммирование

6

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

7

bit.ly/what-is-reactive

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

“I have no ... idea”Erik Meijer

8

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

// 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

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

10

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

11

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

Резюмируя

• Деклативно описывать поведение

• Автоматически обновлять зависимости

12

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

Observable и Computed

13

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

Observable

• Поддерживает чтение и запись

• Можно подписаться

14

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

// Create

// Write value

// Read value

var myObservable = ko.observable();

myObservable(42);

myObservable();

01.

02.

03.

04.

05.

06.

15

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

// 42

Подписка на измененияvar myObservable = ko.observable();

myObservable

.subscribe(value => console.log(value));

myObservable(42);

01.

02.

03.

16

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

Computed

• Вычисляется из зависимостей

• Поддерживает только чтение

• Можно подписаться

17

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

// 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

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

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

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

20

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

Задача

• Выводить список операций

• Обновлять его по таймеру

21

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

22

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

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

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

Операция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

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

Получение данныхget('/operations')

.then(data => view.operations(data));

01.

02.

25

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

Ещё

• Добавить сортировку

26

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

27

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

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

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

Ещё

• Добавить фильтр по id

29

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

30

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

view.sortedOperation()

view.filter()

Хранение данныхview.filter = ko.observable('');

view.filteredOperations = ko.computed(() => {

return filter(

,

);

});

01.

02.

03.

04.

05.

06.

07.

31

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

XHR

operations sortedOp filteredOp

sort filter

DOM

32

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

33

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

Заглянем под капот

34

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

a()

Примерvar a = ko.observable();

var b = ko.computed(() => + 1);

01.

02.

35

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

Подпискаvar a = ko.observable();

a.subscribe(value => console.log(value));

----> a._subscribers.push({ callback: callback });

01.

02.

36

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

Оповещениеa(42);

----> a._notifySubscribers();

----> a._subscribers[0].callback(); // 42

37

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

Вычислительный контекст

• Стек из контекстов

• Регистрация в контексте

38

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

Чтение и регистрацияa();

----> ko._context.register(a);

39

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

Создание контекстаvar b = ko.computed(() => a() + 1;);

----> ko._context.create(b);

----> b._evaluate();

----> ko._context.register(a);

----> a.subscribe(() => b._evaluate(););

----> ko._context.remove();

40

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

Создание computed

1. Вызываем конструктор Computed

2. Computed создаёт контекст

3. Knockout вычисляет Computed

4. Computed подписывается на зависимости

5. Computed удаляет вычислительный контекст

41

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

Другие реализации

42

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

Reactive Extentions

• Пример bit.ly/rx-example

• Доклад bit.ly/rx-talk

43

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

Elm

• Пример bit.ly/elm-example

• Доклад bit.ly/elm-talk

44

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

Спасибо за внимание. Вопросы?

• Оля Кобец, Яндекс

• Twitter @homyasusina

• Пример bit.ly/ko-example

• Слайды bit.ly/homyasusina-talk

45