Что я делаю:Backbone.js + KendoUI - маршрутизация, Просмотров и структурирование с сеткой
Я создаю пример приложения, которое показывает, как включить Кендо UI управления с использованием Rails Backbone.js 3 в качестве сервера JSON.
До сих пор у меня есть Backbone Views, которые управляют шаблонами в файле erb и Backbone Router, который управляет самими представлениями - в зависимости от ссылок, которые нажаты.
Когда это будет закончено, я хочу сделать все это доступным в качестве учебника, чтобы помочь людям, которые хотят попасть в Backbone - и KendoUI (что тоже довольно круто).
Проблема:
Сетка Кендо не рендеринг через пользователь Посмотреть метод отрисовки - даже если это шаблон контейнера.
Прямо сейчас, мне нужно отобразить сетку из метода «Пользователи» маршрутизатора - после того, как маршрутизатор отобразил представление пользователя.
Это кажется странным, что шаблон делает, но сетка не делает - или я что-то отсутствует?
Может быть, это будет проще понять, как только вы увидите код:
index.html.erb
<h1>Kendo Grid Test</h1>
<div id="nav"></div>
<div id="container">
<!-- The templates below will be placed here dynamically -->
</div>
<!-- TEMPLATES -->
<script type="text/template" id="users-grid-template">
<p>Users Grid Template</p>
<div id="users-grid"></div>
</script>
<script type="text/template" id="posts-grid-template">
<div id="posts-grid"></div>
</script>
<script type="text/template" id="nav-template">
<div>
<ul id="nav_container">
<li><a href="#users">Users</a></li>
<li><a href="#posts">Posts</a></li>
</ul>
</div>
</script>
Магистральные Пользователи Просмотр
window.UsersView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, "render");
this.usersGrid = _.template($("#users-grid-template").html());
this.render().el;
},
render: function() {
$(this.el).html(this.usersGrid).fadeIn();
return this;
}
});
Backbone Маршрутизатор
window.AppRouter = Backbone.Router.extend({
routes: {
'users': 'users',
'posts': 'posts'
},
initialize: function() {
this.usersView = new UsersView;
},
posts: function() {
var container = $("#container");
container.empty();
},
users: function() {
var container = $("#container");
container.empty();
container.append(this.usersView.render().el);
var UsersData = new kendo.data.DataSource({
transport: {
read: {
url: "/users",
dataType: "json"
}
}
});
var grid = $("#users-grid").kendoGrid({
dataSource: UsersData,
columns: [
{
field: "first_name",
title: "First Name"
},
{
field: "last_name",
title: "Last Name",
}]
});
container.append(grid);
}
});
window.App = new AppRouter();
Backbone.history.start();
Как вы можете видеть, сетка Кендо UI динамически генерируется и помещается в <div id="users-grid"></div>
от «пользователей сетки-шаблона». Но я должен сделать отдельный метод «добавить», чтобы получить сетку в шаблоне. Это кажется ненужным.
Похоже, что я должен быть в состоянии разместить все это ...
... внутри UsersView метод визуализации - без необходимости использовать метод добавления. Но я не могу заставить это работать.
Любые предложения о том, как структурировать это? Или правильно ли структурирован мой текущий код?
Рекомендация очень ценится!
EDIT - упрощенное решение (благодаря Дерик)
я понял, что я был чрезмерно усложнять это. Я пытался использовать Backbone, чтобы делать то, что уже делал Kendo, - управляя сеткой и источником данных.
Поскольку Backbone настолько модульный, и все, что мне действительно нужно было на данный момент, это его маршрутизатор, я удалил все виды - кроме навигационного представления - и просто использовал маршрутизатор, и пусть Кендо делает свою работу.
Я думаю, что решение намного проще и проще в управлении кодом. (по крайней мере, для меня)
$(document).ready(function(){
window.Navigation = Backbone.View.extend({
el: $("#nav"),
initialize: function() {
_.bindAll(this, "render");
this.nav = $("#nav-template").html();
this.render().el;
},
render: function() {
$(this.el).html(this.nav);
return this;
}
});
window.nav = new Navigation;
window.AppRouter = Backbone.Router.extend({
routes: {
'users': 'users',
'posts': 'posts'
},
initialize: function() {
var container = $("#container");
//container.html("#users-grid");
},
posts: function() {
var container = $("#container");
container.empty();
},
users: function() {
var container = $("#container");
usersTemplate = _.template($("#users-grid-template").html());
container.empty();
container.html(usersTemplate);
var UsersData = new kendo.data.DataSource({
transport: {
read: {
url: "/users",
dataType: "json"
}
}
});
$("#users-grid").kendoGrid({
dataSource: UsersData,
columns: [
{
field: "first_name",
title: "First Name"
},
{
field: "last_name",
title: "Last Name",
}]
});
}
});
window.App = new AppRouter();
Backbone.history.start();
// Closing jquery tag
});
Надеюсь, кто-то найдет это полезным.
Следующий шаг - примените CRUD к этому.
Hey Derick - большое спасибо за то, что взглянул на мою проблему. У меня все еще есть некоторые проблемы, но я попытался включить изменения, которые вы предложили, и я сделал надпись вверх, чтобы вы могли видеть полный код. Может быть, вы можете сказать, где я все еще ошибаюсь. Я чувствую, что я нахожусь на грани понимания этого, но я все еще не вижу ничего фундаментального. Я уже несколько часов стучаю с ним, и теперь мой ум решил взять отпуск :) – PhillipKregg
в новом коде, вы визуализируете представление дважды - один раз в методе инициализации представления и один раз в маршрутизаторе , избавиться от одного из вызовов '.render()' ... я лично удалю его из метода инициализации представления. что может вызвать любые остающиеся проблемы –
Эй, когда вы сказали, что я просматриваю представление дважды, я должен думать - я пытаюсь получить Backbone для управления представлениями, но сетка Kendo и источник данных действительно делают это для меня. Я пытаюсь воссоздать работу с Backbone, когда это не нужно - по крайней мере, за то, что я сейчас делаю. Я сохраню представления, когда мне понадобится больше настраиваемого элемента управления позже. Еще раз спасибо! – PhillipKregg