В последнем сеансе мы создали функцию «Добавить новый блог», и теперь пользователи могут публиковать сообщения в системе блогов. Естественным расширением будет предоставление пользователям возможности изменять и удалять существующие блоги. В этом сеансе мы собираемся заложить основу для этих функций, составив список блогов на странице администратора и добавив маршрутизатор (если вы не знаете, что такое маршрутизатор, этот сеанс для вас).
1. Создание и визуализация BlogsAdminView
Шаг 1: HTML-шаблон
Как обычно, давайте начнем с добавления HTML-шаблона в admin.html
. Это должно быть довольно легко для вас сейчас — очень похоже на #blogs-tpl
в index.html
. Разница лишь в том, что на этот раз мы делаем стол:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<script id=»blogs-admin-tpl» type=»text/x-handlebars-template»>
<table>
<thead>
<tr>
<th>Title</th>
<th>Author</th>
<th>Time</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{{#each blog}}
<tr>
<td><a class=»app-link» href=»#»>{{title}}</a></td>
<td>{{authorName}}</td>
<td>{{time}}</td>
<td>
<a class=»app-link» href=»#»>Edit</a> |
<a class=»app-link» href=»#»>Delete</a>
</td>
</tr>
{{/each}}
</tbody>
</table>
</script>
</ b > |
Шаг 2. Создание класса BlogsAdminView
Аналогично, создайте BlogsAdminView
в admin.js
. Если вы не знакомы с ними, я настоятельно рекомендую вам проверить мои предыдущие сообщения.
01
02
03
04
05
06
07
08
09
10
|
var Blogs = Parse.Collection.extend({
model: Blog
}),
BlogsAdminView = Parse.View.extend({
template: Handlebars.compile($(‘#blogs-admin-tpl’).html()),
render: function() {
var collection = { blog: this.collection.toJSON() };
this.$el.html(this.template(collection));
}
});
|
Шаг 3: Рендеринг BlogsAdminView
Чтобы увидеть список, нам нужно его отрендерить. Давайте просто добавим его в функцию render()
в WelcomeView
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
render: function() {
var attributes = this.model.toJSON();
this.$el.html(this.template(attributes));
var blogs = new Blogs();
blogs.fetch({
success: function(blogs) {
var blogsAdminView = new BlogsAdminView({ collection: blogs });
blogsAdminView.render();
$(‘.main-container’).append(blogsAdminView.el);
},
error: function(blogs, error) {
console.log(error);
}
});
}
|
Проверьте страницу администратора, и вы увидите список под кнопкой « Добавить новый блог» .
2. Маршрутизатор
Если вы будете следовать, я надеюсь, что теперь вы чувствуете себя комфортно при записи и чтении из базы данных. Вы также должны легко создавать и визуализировать представления для представления полученных данных. Однако вы можете начать чувствовать, что здесь и там может быть слишком много View.render()
, и они могут затруднить чтение и поддержку вашего кода. Вы также можете чувствовать себя плохо, увидев admin.html
в URL.
Думая о функции редактирования, которую мы собираемся создать, мы, безусловно, можем создать ее, добавляя события и передавая блог, который мы хотим отредактировать как объект, а затем отображая его. Но разве не было бы здорово, если бы у нас было что-то вроде http://AnExampleDomain.net/edit/id ? Идея роутера поможет нам достичь этого. Это способ сопоставить функции с URL-адресами.
Шаг 1. Добавьте структуру маршрутизатора.
Чтобы помочь вам изучить эту концепцию, почему бы нам не пойти дальше и запустить новый маршрутизатор в admin.js
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
var BlogRouter = Parse.Router.extend({
// Here you can define some shared variables
initialize: function(options){
this.blogs = new Blogs();
},
// This runs when we start the router.
start: function(){
Parse.history.start({pushState: true});
// This is where you map functions to urls.
// Just add ‘{{URL pattern}}’: ‘{{function name}}’
routes: {
‘admin’: ‘admin’,
‘login’: ‘login’,
‘add’: ‘add’,
‘edit/:url’: ‘edit’
},
admin: function() {},
login: function() {},
add: function() {},
edit: function(url) {}
}),
blogRouter = new BlogRouter();
blogRouter.start();
|
Как вы можете видеть, шаблоны URL-адресов легко сопоставить с функциями в маршрутизаторе и запустить его. Теперь, если пользователь заходит /admin
, он запускает функцию admin()
.
Обратите внимание, что вы даже можете принимать параметры в URL-адресах, добавляя двоеточие перед именем переменной, как edit/:url
в приведенном выше коде.
Теперь давайте сделаем несколько шагов для реорганизации нашего существующего кода в маршрутизатор.
Шаг 2: / Страница входа
Самый простой должен быть страницей /login
. Просто переместите код рендеринга в функцию login()
:
1
2
3
4
5
|
login: function() {
var loginView = new LoginView();
loginView.render();
$(‘.main-container’).html(loginView.el);
}
|
Шаг 3: Страница администратора
Далее давайте напишем функцию для страницы /admin
. Ранее, когда пользователи посещали /admin.html
, мы отправляли их на экран входа по умолчанию. И если они успешно вошли в систему, мы отправили их на экран приветствия. Функция рендеринга для welcomeView
была в welcomeView
успеха. Это не лучший способ организовать ваш код, и это не удобно для вашего пользователя.
Итак, теперь давайте просто проверим на странице /admin
. Если они вошли в систему, мы показываем им страницу приветствия, а если нет, мы перенаправляем их в /login
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
admin: function() {
// This is how you can current user in Parse
var currentUser = Parse.User.current();
if ( !currentUser ) {
// This is how you can do url redirect in JS
blogRouter.navigate(‘login’, { trigger: true });
} else {
var welcomeView = new WelcomeView({ model: currentUser });
welcomeView.render();
$(‘.main-container’).html(welcomeView.el);
// We change it to this.blogs so it stores the content for other Views
// Remember to define it in BlogRouter.initialize()
this.blogs.fetch({
success: function(blogs) {
var blogsAdminView = new BlogsAdminView({ collection: blogs });
blogsAdminView.render();
$(‘.main-container’).append(blogsAdminView.el);
},
error: function(blogs, error) {
console.log(error);
}
});
}
}
|
Как вы можете видеть из кода, мы используем blogRouter.navigate()
чтобы перенаправить их на страницу /login
. Аналогично, давайте изменим функцию рендеринга в представлении /login
на функцию blogRouter.navigate()
:
01
02
03
04
05
06
07
08
09
10
|
Parse.User.logIn(username, password, {
// If the username and password matches
success: function(user) {
blogRouter.navigate(‘admin’, { trigger: true });
},
// If there is an error
error: function(user, error) {
console.log(error);
}
});
|
Не забудьте убрать старые функции рендеринга из предыдущего кода.
Шаг 4. Проверка и настройка навигации по умолчанию в качестве временного решения
Давайте попробуем эти две функции. Тест и … ничего! Это потому, что нам нужно указать /admin
при запуске; admin.html
сам по себе не соответствует ни одному шаблону URL, который мы установили в маршрутизаторе.
Давайте добавим навигацию по умолчанию в функцию start()
чтобы при запуске маршрутизатора пользователь автоматически переходил на страницу /admin
:
1
2
3
4
|
start: function(){
Parse.history.start({pushState: true});
this.navigate(‘admin’, { trigger: true });
}
|
Теперь, если вы попробуете, все должно работать правильно:
Обратите внимание, что вы все еще не можете напрямую посетить /admin
или /login
. И если вы помещаете свой проект в каталог, вы, вероятно, заметите, что ваш URL будет перенаправлен с http: //localhost/directory/admin.html на http: // localhost / admin , и это кажется странным. Мы рассмотрим и решим эти вопросы на будущих сессиях. Сегодня наша главная цель — понять, как работает маршрутизатор после его запуска, и заложить некоторые основы.
Шаг 5: / добавить страницу
WelcomeView
пора перенести рендеринг страницы «Добавить новый блог» из WelcomeView
на маршрутизатор.
1
2
3
4
5
6
7
8
9
|
BlogRouter = Parse.Router.extend({
…
add: function() {
var addBlogView = new AddBlogView();
addBlogView.render();
$(‘.main-container’).html(addBlogView.el);
},
…
})
|
Мы также можем переписать событие в WelcomeView
чтобы просто вызвать навигацию:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
WelcomeView = Parse.View.extend({
template: Handlebars.compile($(‘#welcome-tpl’).html()),
events: {
‘click .add-blog’: ‘add’
},
add: function(){
blogRouter.navigate(‘add’, { trigger: true });
},
render: function(){
var attributes = this.model.toJSON();
this.$el.html(this.template(attributes));
}
})
|
Теперь проверьте и убедитесь, что все работает.
Вывод
На этом занятии мы сделали еще один просмотр блогов в админ-панели, и вы узнали о важной концепции маршрутизатора. Надеюсь, теперь для вас вполне естественно создавать и визуализировать представления с помощью Parse.js. И вы начали понимать, как маршрутизатор может помочь нам организовать и повторно использовать наш код.
Мы не копались в деталях механики маршрутизатора, например, понимали, почему мы должны иметь {trigger: true}
. Как я уже упоминал ранее, цель этого урока — показать вам, как вы можете заставить вещи работать. Но если вы заинтересованы в получении дополнительной информации, обязательно ознакомьтесь с документацией . Мы также рассмотрим больше знаний о маршрутизаторах, когда нам это понадобится позже в этой серии.
В следующем сеансе мы собираемся создать страницу /edit
и использовать маршрутизатор для реального использования. Я надеюсь, что ты взволнован, чтобы прибить это. Мы скоро соберем все вместе, так что следите за обновлениями!