Давайте представим, что у вас есть компоненты list и template.
При клике по любому из элементов списка (list), вам нужно показать его детальную информацию в шаблоне (template).
А при клике по кнопке внутри шаблона — вернуться обратно к списку.
И в зависимости от того, как вы инициализируете эти компоненты, для реализации задуманого будут применяться разные шаблоны:
Webix лейаут можно создать следующим образом:
webix.ui({
container: "app1_here", rows: [
{ template: "Click on item", type: "header" },
{ cells: [
{ view: "list", url: "data.json",
template: "#title#", select: true, id: "mylist" },
{ template: "<button onclick='history.back()'>Back</button>",
id: "details" }
]}
]
});
А теперь давайте создадим Backbone Маршрутизатор:
var routes = new (Backbone.Router.extend({
routes: {
"": "index",
"films/:id":"details" // вызываем функцию details()
},
details: function(id){
$$("details").show(); // показываем template с описанием фильма
},
index: function(){
$$("mylist").show();
}
}));
Как вы видите, маршрутизатор показывает компоненты на основе сегментов URL текущей страницы. После переключения на шаблон "details", приложение получает новый URL localhost/myapp.html#films/id, последний сегмент которого отображает ID выбранного элемента списка.
Для полноценной работы приложения, нам нужно прописать еще несколько строк кода:
$$("mylist").attachEvent("onAfterSelect", function(id){ //правило навигации
routes.navigate("films/"+id, { trigger:true });
});
Backbone.history.start(); // маршрутизатор начинает запоминать навигацию
Related sample: Routes.The Webix way
Код выше определяет правило навигации сразу после выбора элемента списка и запускает маршрутизатор. А шаблон, в свою очередь, использует уже существующий маршрутизатор и делает шаг назад при клике по кнопке внутри блока.
А теперь давайте создадим такое же приложение, но с использованием гибридных Backbone-Webix компонентов.
var layout = new WebixView({
el: "#app1_here",
config: {
rows: [
{ template: "Click on item", type: "header" },
{
view: "list", url: "common/data.json",
template: "#title#", select: true,
id: "mylist"
}
]
}
});
var DView = Backbone.View.extend({
el: "#app1_here", // такой же контейнер как и в коде выше
tagName: "div",
render: function(){
$(this.el).html("<button onclick='history.back()'>Back</button>");
},
});
var template = new DView();
А маршрутизатор будет немного отличаться:
var routes = new (Backbone.Router.extend({
routes: {
"": "index",
"films/:id": "details" // вызываем функцию details()
},
details: function(id){
template.render(); // отрисовываем шаблон в его "el" контейнере
},
index: function(){
layout.render(); // заново отрисовываем лейаут
// устанавливаем правило навигации
$$("mylist").attachEvent("onAfterSelect", function(id){
routes.navigate("films/"+id, { trigger: true });
});
}
}));
Related sample: Routes.The Backbone way
Вместо переключения между Webix компонентами в лейауте, здесь мы каждый раз отрисовываем нужный Backbone компонент в одном и том же контейнере, в зависимости от текущего состояния. А поведение остается прежним.
Но маршрутизатор должен запускаться отдельно, после инициализации приложения:
// инициализация приложения
Backbone.history.start();
При работе с Webix компонентами мы можем обновлять как родительский компонент, так и его дочерние компоненты (отдельные части layout).
Давайте создадим 3 отдельных компонента:
Компоненты list и template будут показаны в лейауте с помощью маршрутизатора:
var template = new WebixView({
config: { template:"<button onclick='history.back()'>Back</button>" }
});
var list = new WebixView({
config: {
view: "list", url: "common/data.json",
template: "#title#", select: true,
id: "mylist"
}
});
// лейаут с конфигурацией
var layout = new WebixView({
el: "#app1_here",
config: {
rows: [
{ template: "Click on item", type: "header" },
{ }
]
}
});
А маршрутизатор будет таким:
var routes = new (Backbone.Router.extend({
routes: {
"": "index",
"films/:id": "details"
},
details: function(id){
// определяем контейнер для template
template.el = layout.root.getChildViews()[1];
template.render();
},
index:function(){
// определяем контейнер для list
list.el = layout.root.getChildViews()[1];
list.render();
$$("mylist").attachEvent("onAfterSelect", function(id){
routes.navigate("films/"+id, { trigger: true });
});
}
}));
Маршрутизатор находит ячейку в лейауте и отрисовывает в ней необходимый компонент.
Related sample: Routes.Changing the Webix Layout
Наверх