84

DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Embed Size (px)

Citation preview

Page 1: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 2: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

С 2011 года работаю в 2ГИС:

- API Справочника > 5млн- API Карт > 8млн- Карты 2ГИС > 3млн

Page 3: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 4: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 5: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 6: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 7: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 8: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Пользователь

2ГИС Онлайн

API Справочника

АРХИТЕКТУРА WEB-APP

WWW.2GIS.RU

Page 9: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

АРХИТЕКТУРА CLIENT-SIDE APP

Пользователь

2ГИС Онлайн

API Транспорта

API пробок

API <Место для

вашего сервиса>

API Справочник

API Карт +1

WWW.2GIS.RU

Page 10: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

DOM НА КЛИЕНТЕ

WWW.2GIS.RU

Page 11: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

DOM НА КЛИЕНТЕ

var newDiv = document.createElement('div'); newDiv.className = 'my-class'; newDiv.id = 'my-id';

newDiv.innerHTML = 'Привет, мир!';

$('#container').appendChild(newDiv);

Привет, мир!

WWW.2GIS.RU

Page 12: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

WHERE IS

Page 13: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ШАБЛОНИЗАТОРЫ

jQueryTemplate

Mustache

Underscore.js

Шаблонизатор резига

Pure

WWW.2GIS.RUWWW.2GIS.RU

Page 14: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

СОБЫТИЯ

.firmShort

.firmFull#firmList

WWW.2GIS.RUWWW.2GIS.RU

Page 15: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

СОБЫТИЯ

$("#firmTemplate").tmpl(someData).appendTo("#firmList");

$('.firmShort').live({ click: function() { showFirmCard(this); } });

$('.firmFull').live({ click: function() { hideFirmCard(this); } });WWW.2GIS.RUWWW.2GIS.RU

Page 16: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

СОБЫТИЯ

Page 17: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 18: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 19: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ПОЧЕМУ KNOCKOUT?

Активно развивается

WWW.2GIS.RUWWW.2GIS.RU

Page 20: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

● Активно развивается

ПОЧЕМУ KNOCKOUT?

Удобное разделение логики и шаблонов

WWW.2GIS.RUWWW.2GIS.RU

Page 21: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

● Активно развивается● Удобное разделение логики и шаблонов

ПОЧЕМУ KNOCKOUT?

Функционален, есть декларативные биндинги

WWW.2GIS.RUWWW.2GIS.RU

Page 22: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

● Активно развивается● Удобное разделение логики и шаблонов● Функционален, есть декларативные

биндинги

ПОЧЕМУ KNOCKOUT?

Низкий порог вхождения

WWW.2GIS.RUWWW.2GIS.RU

Page 23: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 24: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

MVVM

View Model

ViewModel

UI Logic Business Logic

Application Logic

WWW.2GIS.RUWWW.2GIS.RU

Page 25: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

KNOCKOUT

WWW.2GIS.RUWWW.2GIS.RU

Page 26: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<div class="dg-search-result-header"> <span data-bind="text: what_text"></span>, <span data-bind="text: where_text"></span></div>

KNOCKOUT

WWW.2GIS.RUWWW.2GIS.RU

Page 27: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

function vm() {this.what_text = ko.observable('');

}ko.applyBindings(new vm());...vm.what_text(response.what);

<span data-bind="text: what_text"></span>

KO.OBSERVABLE

WWW.2GIS.RUWWW.2GIS.RU

Page 28: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

МАССИВЫ

WWW.2GIS.RUWWW.2GIS.RU

Page 29: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

response.result = [ { firmName = 'Театр №1', ... }, { firmName = 'Театр №2'; ... }]

МАССИВЫ

WWW.2GIS.RUWWW.2GIS.RU

Page 30: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

function vm () {this.firms = ko.observableArray([]);

}...vm.firms(response.result);

<div data-bind="foreach: firms"><div data-bind="text: firmName"></div>

</div>

KO.OBSERVABLE_ARRAY

WWW.2GIS.RUWWW.2GIS.RU

Page 31: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDINGS

Page 32: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<div class="dg-search-result-header"> <span data-bind="text: what_text"></span>, <span data-bind="text: where_text"></span></div>

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 33: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDINGS

— Текст и стиль блока

— Control flow

— Работа с формами

— Шаблонизация

— <место для ваших идей>

WWW.2GIS.RUWWW.2GIS.RU

Page 34: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

.firmShort

.firmFull#firmList

WWW.2GIS.RUWWW.2GIS.RU

BINDINGS

Page 35: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<div id="firmList" data-bind="foreach: firms"><div class="firmShort"

data-bind="visible: !isVisible"></div><div class="firmFull"

data-bind="visible: isVisible"></div></div>

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 36: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 37: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

data-bind="visible: isVisible,click: toggleVisibility"

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 38: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

data-bind="visible: isVisible,click: toggleVisibility"

toggleVisibility = function() { this.isVisible(!this.isVisible());}

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 39: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 40: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ko.bindingHandlers['visible'] = { 'update': function (element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); var isCurrentlyVisible = !(element.style.display == "none"); if (value && !isCurrentlyVisible) element.style.display = ""; else if ((!value) && isCurrentlyVisible) element.style.display = "none"; }};

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 41: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ko.bindingHandlers['animateVisible'] = { 'update': function (element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); var isCurrentlyVisible = !(element.style.display == "none"); var slideSpeed = 200; if (value && !isCurrentlyVisible) $(element).slideDown(slideSpeed, callback); else if ((!value) && isCurrentlyVisible) $(element).slideUp(slideSpeed, callback); }};

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 42: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

data-bind="animateVisible: isVisible,click: toggleVisibility"

toggleVisibility = function() { this.isVisible(!this.isVisible());}

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 43: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 44: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 45: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<script type="text/my-tpl" id="firm-tpl"> //firm template code</script>

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 46: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<script type="text/my-tpl" id="catalog-tpl"> //some template code <div data-bind="template: { name: 'firm-tpl', foreach: firms }"></div></script>

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 47: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDINGS

Page 48: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDING-CONTEXT

vm

vm.firms[n]

WWW.2GIS.RUWWW.2GIS.RU

Page 49: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ПЕЧАТЬ

WWW.2GIS.RUWWW.2GIS.RU

Page 50: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

<script type="text/my-tpl" id="print-tpl"> //some template code <div data-bind="template: { name: 'firm-tpl', foreach: firms,

templateOptions: { isPrint: 1 } }"></div></script>

ПЕЧАТЬ

WWW.2GIS.RUWWW.2GIS.RU

Page 51: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDINGS

<div class="phone-number" data-bind="visible: $context.isPrint)"> <!-- Some code--></div>

WWW.2GIS.RUWWW.2GIS.RU

Page 52: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDINGS

<div class="contacts" data-bind="template: { name: 'firm-tpl', data: $data, templateOptions: { isPrint: $context.isPrint } }"> <!-- Some code--></div>

WWW.2GIS.RUWWW.2GIS.RU

Page 53: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

$context

$data

templateOptions

BINDING CONTEXT

WWW.2GIS.RUWWW.2GIS.RU

Page 54: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

BINDING CONTEXT

● $parent● $parentContext● $root● $index● $element

WWW.2GIS.RUWWW.2GIS.RU

$context

$data

templateOptions

Page 55: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 56: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

function initBalloon (options) { map.createBalloon({ point: options.point; content: options.template }); }

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 57: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

function initBalloon (options) { map.createBalloon({ point: options.point; content: options.template });

var container = $('#balloonContent'); ko.applyBindingsToNode(container , vm);}

BINDINGS

WWW.2GIS.RUWWW.2GIS.RU

Page 58: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

КОГДА МНОГО "ЕСЛИ"

WWW.2GIS.RUWWW.2GIS.RU

Page 59: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

this.showPreloader = ko.computed(function(){ return this.firmsLoad() && this.geoLoad();});

<span id="preloader" data-bind="visible: showPreloader"></span>

КОГДА МНОГО "ЕСЛИ"

WWW.2GIS.RUWWW.2GIS.RU

Page 60: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Не наблюдайте один computed внутри другого

KO.COMPUTED

WWW.2GIS.RUWWW.2GIS.RU

Page 61: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

WWW.2GIS.RU

Page 62: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

1. Не наблюдайте один computed внутри другого

KO.COMPUTED

Не меняйте observable внутри computed

WWW.2GIS.RUWWW.2GIS.RUWWW.2GIS.RU

Page 63: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

1. Не наблюдайте один computed внутри другого2. Не меняйте observable внутри computed

KO.COMPUTED

Используйте computed только там, где это необходимо

WWW.2GIS.RUWWW.2GIS.RU

Page 64: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

PLUGINS

Page 65: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

PLUGINS

knockout.address

WWW.2GIS.RUWWW.2GIS.RU

Page 66: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

PLUGINS

window.location vm.myObservable

ko.linkObservableToUrl(vm.history, 'history');

WWW.2GIS.RUWWW.2GIS.RU

knockout.address

Page 67: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 68: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

PLUGINS

WWW.2GIS.RUWWW.2GIS.RU

$('#firmFull').dataBind({ animateVisible: isVisible, click: toggleVisibility});

Page 69: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

https://gist.github.com/joelnet/1006808

PLUGINS

WWW.2GIS.RUWWW.2GIS.RU

Unobtrusive Knockout support library for jQuery

Joel Thoms

Page 70: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

https://github.com/SteveSanderson/knockout/wiki/Plugins

PLUGINS

WWW.2GIS.RUWWW.2GIS.RU

Page 71: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 72: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья
Page 73: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

БОЛЬШИЕ ПРОЕКТЫ

107 22 18

Observable Computed ObservableArray

WWW.2GIS.RUWWW.2GIS.RU

Page 74: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Functions

БОЛЬШИЕ ПРОЕКТЫ

200+ 107 22 18

WWW.2GIS.RUWWW.2GIS.RU

Page 75: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

БОЛЬШИЕ ПРОЕКТЫ

18

WWW.2GIS.RUWWW.2GIS.RU

107200+13 22

Page 76: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Namespace.ViewModelModules.<ourModule> = { _observables: { <ourObservable>: <defaultData>, <ourComputed>: function(){/*computedCode*/} }, <someProperty>: 100500, _initModule: function(){/*initCode*/}, <function>: function(){/*fBody*/}}

БОЛЬШИЕ ПРОЕКТЫ

WWW.2GIS.RUWWW.2GIS.RU

Page 77: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Namespace.ViewModelModules.<ourModule> = { _observables: { <ourObservable>: <defaultData>, <ourComputed>: function(){/*computedCode*/} }, <someProperty>: 100500, _initModule: function(){/*initCode*/}, <function>: function(){/*fBody*/}}

WWW.2GIS.RU

БОЛЬШИЕ ПРОЕКТЫ

150

WWW.2GIS.RUWWW.2GIS.RU

Page 78: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

https://github.com/2gis/dgKoModulizer

dgKoModulizer

WWW.2GIS.RUWWW.2GIS.RU

Page 79: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

IDE

data-bind=" //очень много //кода //который выглядит //как одна сплошная строка"

WWW.2GIS.RUWWW.2GIS.RU

Page 80: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

IDE

WWW.2GIS.RUWWW.2GIS.RU

Page 81: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

IDE

WWW.2GIS.RUWWW.2GIS.RU

Page 82: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

ПРОИЗВОДИТЕЛЬНОСТЬ

WWW.2GIS.RUWWW.2GIS.RU

DOM.Build()

Page 83: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

АНАЛОГИ

— AngularJS— Backbone.js— Ember.js— ExtJS�— CorMVC— AsanaLuna— ...

WWW.2GIS.RUWWW.2GIS.RU

Page 84: DUMP-2013 Frontend - Knockoutjs на примере 2ГИС-Онлайн - Таратухин Илья

Илья Таратухин@darklifa