29. Router. URL-object. URL-event
Навигация через адресную строку
#/hotels/567/rooms/23/facilities/?hints=true
Парсим строку по маске
{pathname: {Array, String}, mask: {Array, String}}
Слабое связывание
$xo.trigger('url', urlObject)
Организация структуры приложения
xo.pages['hotels.id.rooms.id.facilities']
xo.app.pages['hotels/567/rooms/23/facilities']
30. DOM-Data через Expando
Связывание любых данных с DOM
Bспользованиt библиотек и плагинов,
использующих $.data() или подобную
организацию данных через Expando
Не засорять неймспейс временными или
чужими данными.
31. Parent.removeChild(Child)
Самые затратные операции с DOM.
Строим только один раз.
Выдернутая построеная вьюха невидима но
живая.
Сохраняются DOM-данные через Expando,
а значит сохраняются преимущества
предыдущего слайда :)
32. Отказ от Delegate
Backbone слушает дерево view.el
Минимум детей у нодов — быстрее отклик
Так как вьюха собирается 1 раз, то можно
потратить время на сборе побольше
Прямые связки Knockout-bindings
33. Knockout
Ясная логика темплейта
Автоматическое изменение UI
Дисперсионные изменения в DOM —
скорость
Безопасная MVVM по keyUp/keyDown
Многопользовательский режим
34. Backbone + Knockout
Router + CRUD + MVVM
Two-way: model.set() триггерит изменения в
observables; и наоборот attributes подписаны на
оbservables.
Постепенный перевод вьюх из Backbone в
Knockout.
35. Отказ от Extend в «бешеных» вьюхах
Backbone при предподготовке модели как
минимум 3 раза бегает for-in по объекту
this.attributes = _.extend({}, defaults, attributes)
this._previousAttributes = _.clone(this.attributes)
Либо заменить объекты на парные массивы
и бегать do {--n} while (n)
this.defaultsKeys = [ “id”, “name” ]
this.defaultsVals = [ “456”, “Ivan Zolotov” ];
Либо отказаться от Backbone + Knockout