На нашем последнем занятии мы создали представление для управления существующими записями в блоге и рассмотрели идею маршрутизатора. Теперь пришло время создать функцию редактирования.
1. Создайте и визуализируйте EditBlogView
Чтобы построить функцию редактирования, давайте сначала EditBlogView
. Опять же, это должно быть очень легко для вас сейчас. Мы прошли долгий путь вместе.
Шаг 1: HTML-шаблон
Эта часть очень похожа на шаблон AddBlogView
. Единственная реальная разница в том, что, поскольку мы редактируем блог, нам нужно передать существующий заголовок и контент.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<script type=»text/template» id=»edit-tpl»>
<h2>Edit Blog</h2>
<form class=»form-edit» role=»form»>
<div class=»form-group»>
<label for=»title»>Title</label>
<input name=»title» type=»text» class=»form-control» id=»title» value=»{{title}}»></input>
</div>
<div class=»form-group»>
<label for=»content»>Content</label>
<textarea name=»content» class=»form-control» rows=»20″>{{{content}}}</textarea>
</div>
<button class=»btn btn-lg btn-primary btn-block» type=»submit»>Submit</button>
</form>
</script>
|
Шаг 2: EditBlogView
И тогда EditBlogView
. Опять же, это очень похоже на AddBlogView
. В целях данного урока мы сосредоточены на том, как заставить его работать в первую очередь. На следующем занятии мы выполним всю работу по очистке и удалим дублирующийся код. Потерпи пока.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
EditBlogView = Parse.View.extend({
template: Handlebars.compile($(‘#edit-tpl’).html()),
events: {
‘submit .form-edit’: ‘submit’
},
submit: function(e) {
e.preventDefault();
// We will write the submit function later
},
render: function(){
var attributes = this.model.toJSON();
this.$el.html(this.template(attributes));
}
})
|
На этот раз мы не собираемся сначала проверять и убедиться, что эта часть кода работает — в идеале вы сделали это достаточно раз, чтобы вам было удобно двигаться дальше. Всегда проверяйте предыдущие сессии или оставляйте мне комментарии, если вы чувствуете, что застряли.
2. Ссылка на / редактировать страницу с маршрутизатором
Теперь давайте удостоверимся, что /edit/
будет ссылаться и отображать правильный вид редактирования.
Шаг 1: / edit /: id
В прошлый раз мы уже сделали часть подготовки. У нас есть шаблон URL для страницы /edit
в BlogRouter.routes
:
1
2
3
4
5
6
|
routes: {
‘admin’: ‘admin’,
‘login’: ‘login’,
‘add’: ‘add’,
‘edit/:url’: ‘edit’
}
|
Как вы можете видеть, шаблон URL уже указывает на BlogRouter.edit()
, в которой у нас есть небольшая функция-заполнитель, которая принимает входной параметр url:
1
|
edit: function(url) {}
|
Это означает, что если вы посетите http: // localhost / your-directory / edit / what-ever-you-put-here , будет BlogRouter.edit()
функция BlogRouter.edit()
, а переменная url
внутри этой функции получит значение из what-ever-you-put-here
.
Итак, что же проще всего добавить после /edit
что поможет нам найти именно тот пост в блоге, который мы хотим отредактировать? Это должен быть id
, верно? Давайте немного изменим код, чтобы было ясно, что мы разместим там id
.
01
02
03
04
05
06
07
08
09
10
|
routes: {
‘admin’: ‘admin’,
‘login’: ‘login’,
‘add’: ‘add’,
‘edit/:id’: ‘edit’
},
…
edit: function(id) {}
|
Шаг 2: Получить блог по его идентификатору
Теперь, когда мы получили id
из URL, нам нужно найти этот конкретный блог с этим id
. Способ сделать это в Parse.js — использовать запрос:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
edit: function(id) {
// First, you need to define a new query and tell it which table should it go for
var query = new Parse.Query(Blog);
// If you are looking for object by their id,
// just pass the id as the first parameter in .get() function
query.get(id, {
success: function(blog) {
// If the blog was retrieved successfully.
},
error: function(blog, error) {
// If the blog was not retrieved successfully.
}
});
}
|
Если вы хотите узнать больше о запросах Parse, проверьте их документацию .
Шаг 3: Рендеринг editBlogView
Давайте продолжим завершать функции success
и error
в обратном вызове запроса.
Для функции success
мы хотим визуализировать editBlogView
используя этот пост в качестве модели:
1
2
3
4
5
|
success: function(blog) {
var editBlogView = new EditBlogView({ model: blog });
editBlogView.render();
$(‘.main-container’).html(editBlogView.el);
}
|
А для функции error
давайте просто зарегистрируем ошибку как обычно:
1
2
3
|
error: function(blog, error) {
console.log(error);
}
|
Шаг 4: Ссылка на страницу редактирования
Продолжим, давайте обновим ссылки на редактирование в #blogs-admin-tpl
чтобы они действительно ссылались на /edit
страницы. Давайте также дадим ему уникальный класс, потому что мы будем ссылаться на него:
1
|
<a class=»app-link app-edit» href=»edit/{{objectId}}»>Edit</a> |
|
И чтобы убедиться, что маршрутизатор получает изменение URL-адреса (поскольку он еще не статичен), давайте напишем нашу собственную функцию ссылки, которая заменит функцию по умолчанию в BlogAdminView
.
Сначала добавьте событие для нажатия .app-edit
. Вот почему нам нужен был класс раньше!
1
2
3
|
events: {
‘click .app-edit’: ‘edit’
}
|
Затем в функции edit()
предотвратите действие по умолчанию, получите значение href и используйте blogRouter.navigate()
для его запуска.
1
2
3
4
5
|
edit: function(e){
e.preventDefault();
var href = $(e.target).attr(‘href’);
blogRouter.navigate(href, { trigger: true });
}
|
Теперь мы можем проверить это:
На этом этапе тестирование может быть немного сложным, поскольку маршрутизатор еще не полностью настроен. Просто перейдите по адресу http: //localhost/your-directory/admin.html в качестве отправной точки при каждом обновлении. Мы позаботимся об этом на следующей сессии.
3. Отправить блог Править
Мы так близки к тому, чтобы эта страница заработала. Нам просто нужно заставить EditBlogView.submit()
работать.
Шаг 1: Blog.update ()
Так же, как мы создали Blog.create()
для добавления нового блога, теперь нам нужно создать функцию Blog.update()
для сохранения наших правок.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
update: function(title, content) {
this.set({
‘title’: title,
‘content’: content
}).save(null, {
success: function(blog) {
alert(‘Your blog ‘ + blog.get(‘title’) + ‘ has been saved!’);
},
error: function(blog, error) {
console.log(blog);
console.log(error);
}
});
}
|
Как видите, она очень похожа на .create()
, но вместо создания и сохранения нового блога вы сначала устанавливаете значение для текущего объекта, а затем сохраняете его.
Шаг 2: EditBlogView.submit ()
Теперь давайте получим данные из формы в EditBlogView
и .submit()
функцию .submit()
для модели (которая ссылается на текущий пост в блоге, представленный в виде редактирования). Опять же, очень похоже на то, что в AddBlogView
:
1
2
3
4
5
|
submit: function(e) {
e.preventDefault();
var data = $(e.target).serializeArray();
this.model.update(data[0].value, $(‘textarea’).val());
}
|
Попробуйте, и это должно работать!
Если вы уже следовали этому уроку, действительно, молодец.
4. Бонус: читаемый URL
Если вам не нравится видеть идентификатор в URL, и вы хотите, чтобы он был похож на /edit/your-blog-title/
, вы также можете сделать это довольно легко.
Просто добавьте новый url
поля в сообщения блога и добавьте его в .create()
:
1
2
3
|
‘url’: title.toLowerCase()
.replace(/[^\w ]+/g,»)
.replace(/ +/g,’-‘)
|
А в BlogRouter.edit()
запрашивайте сообщения в блогах по их значению url
:
1
2
3
4
5
6
7
|
query.equalTo(«url», url).find().then(function(blogs) {
// This query will return all the qualifying blogs in an array
// So just get the first one
// If you want to learn more, check out Parse.js’s doc
var blog = blogs[0];
…
});
|
Я не буду давать весь код здесь, потому что я думаю, что вы можете собрать его вместе сейчас!
Вывод
Теперь все должно собраться вместе для вас. Вы уже достигли огромного прогресса. В этом сеансе мы создали целую функцию редактирования для блога: от подготовки страницы до настройки маршрутизатора, а затем до обновления базы данных.
В следующий раз мы сделаем большую очистку в нашей кодовой базе. Теперь у нас есть много перекрывающегося кода здесь и там, потому что мы просто хотим убедиться, что мы можем построить функции для работы. В следующий раз вы объедините index.html
и admin.html
, .create()
и .update()
, AddBlogView
и EditBlogView
. Вы также научитесь создавать надежную структуру приложения с помощью Parse.js.
Что еще? Мы также вернемся к маршрутизатору, чтобы URL-адреса могли быть статическими (это означает, что вы можете добавить его в закладки, обновить страницу или отправить другу). Много хорошего впереди, так что следите за обновлениями!