Статьи

Начните создавать свой блог с помощью Parse.js: удаление, выход из системы и просмотр отдельного блога

Конечный продукт
Что вы будете создавать

На последнем занятии вы реорганизовали всю свою систему блогов. Теперь, когда все вычищено, вы готовы ускорить новые приключения. В этом сеансе мы собираемся сделать больше с маршрутизатором и добавим еще три функции в нашу систему блогов: удаление, выход из системы и просмотр отдельного блога.

В части 6 мы рассмотрели функцию редактирования. Скорее всего, вы также хотели бы удалить один из ваших сообщений в блоге. Вы можете поместить эту функцию в два места: добавить ее в BlogsAdminView или отправить по URL-адресу и BlogsAdminView ее в Router .

Я покажу вам путь маршрутизатора. Он используется чаще и делает код лучше структурированным.

Как обычно, давайте сначала добавим шаблон URL:

1
2
3
4
5
6
7
8
routes: {
       »: ‘index’,
       ‘admin’: ‘admin’,
       ‘login’: ‘login’,
       ‘add’: ‘add’,
       ‘edit/:id’: ‘edit’,
       ‘del/:id’: ‘del’
   }

Затем обновите ссылку на странице администратора:

1
<a class=»app-link» href=»#/del/{{objectId}}»>Delete</a>

Теперь давайте добавим новую функцию del к маршрутизатору для ее обработки. Это довольно просто: найдите сообщение в блоге, используя id мы передали из URL, и уничтожьте его.

Попробуйте бросить вызов себе и написать это, не читая мой код. Вы должны получить действительно хорошее представление о Parse.js на этом этапе.

1
2
3
4
5
6
7
8
del: function(id) {
       var query = new Parse.Query(Blog);
       query.get(id).then(function(blog){
           blog.destroy().then(function(blog){
               alert(‘Deleted!’);
           })
       });
   }

Обратите внимание, что здесь вы можете использовать функцию .then() вместо передачи объекта, как мы делали ранее:

1
2
3
4
5
6
7
8
query.get(id, {
       success: function(blog) {
           …
       },
       error: function(blog, error) {
           …
       }
   });

Это простой способ добавить функции обратного вызова в Parse.js, делая ваш код чище и более читабельным. Перейдите на Parse.com, чтобы увидеть полную документацию по обещаниям .

Давайте проведем тестовый прогон и дважды проверим базу данных, чтобы увидеть, работает ли она.

Удалить оповещение

Поздравляю, это работает!

Если вы обратите внимание на URL-адрес, вы увидите, что после того, как вы щелкнете из окна предупреждения, URL-адрес по-прежнему будет /del/ а только что удаленное сообщение все еще там. Мы хотим отправить пользователей обратно на страницу администратора после удаления, и страница должна обновиться и отразить только что сделанные изменения.

Вы можете достичь всего этого, выполнив перенаправление:

1
2
3
4
5
6
7
8
9
del: function(id) {
       var self = this,
           query = new Parse.Query(Blog);
       query.get(id).then(function(blog){
           blog.destroy().then(function(blog){
               self.navigate(‘admin’, { trigger: true });
           })
       });
   }

Обратите внимание, что поскольку в этот раз вы вызываете navigate из маршрутизатора, вы можете просто сохранить маршрутизатор как self и вызвать self.navigate() .

Наконец, мы должны убедиться, что вы единственный, кто может удалять ваши сообщения в блоге. Давайте проверим логин для функции. Это должно быть так же, как функция edit .

1
2
3
4
5
6
7
del: function(id) {
       if (!Parse.User.current()) {
           this.navigate(‘#/login’, { trigger: true });
       } else {
           …
       }
   }

Как и удаление, выход из системы также может обрабатываться маршрутизатором. И это также начинается с добавления шаблона URL:

1
2
3
4
routes: {
       …
       ‘logout’: ‘logout’
   },

Сама функция выхода из системы очень проста в Parse.js. Просто вызовите Parse.User.logOut() и затем перенаправьте на страницу /login :

1
2
3
4
logout: function () {
       Parse.User.logOut();
       this.navigate(‘#/login’, { trigger: true });
   }

И, наконец, давайте добавим кнопку в #admin-tpl :

1
<a href=»#/logout» class=»add-blog btn btn-lg»>Logout</a>
Кнопка выхода

Как вы можете видеть, стилизация не является целью этого урока. Не стесняйтесь исправлять отступы и стилизовать их так, как вам нравится.

Теперь давайте перейдем к созданию новых функций.

До этого момента мы показываем всю статью блога на главной странице. Хотя некоторые люди предпочитают этот стиль, большинство систем ведения блогов поддерживают идею предварительного составления сводного фрагмента, и если посетители нажимают на статьи, они могут увидеть контент на отдельной странице, возможно, с некоторой областью комментариев вокруг нее.

Я проведу вас через создание этого подробного блога в этом сеансе, а в следующем мы сосредоточимся на создании комментариев.

Сначала добавим столбец для сводки в таблице блогов:

Добавить сводную колонку

Теперь давайте добавим его в Blog.update() . Вы можете изменить функцию для получения объекта данных, который содержит заголовок, сводку и содержимое, чтобы избежать запоминания порядка переменных.

01
02
03
04
05
06
07
08
09
10
11
12
13
update: function(data) {
       // Only set ACL if the blog doesn’t have it
       …
        
       this.set({
           ‘title’: data.title,
           ‘summary’: data.summary,
           ‘content’: data.content,
           …
       }).save(null, {
           …
       });
   }

Добавьте еще один <textarea> для сводки в #write-tpl :

1
2
3
4
5
// Put this form-group in between the form-group for title and content
   <div class=»form-group»>
       <label for=»summary»>Summary</label>
       <textarea name=»summary» class=»form-control» rows=»3″>{{summary}}</textarea>
   </div>

И измените WriteBlogView.submit() соответственно:

1
2
3
4
5
6
7
8
submit: function(e) {
       …
       this.model.update({
           title: data[0].value,
           summary: data[1].value,
           content: data[2].value
       });
   }

Теперь, поскольку мы добавили новую переменную в шаблон, нам нужно присвоить ей пустое значение по умолчанию в функции WriteBlogView.render() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
render: function(){
       …
        
       if (this.model) {
           …
       } else {
           attributes = {
               form_title: ‘Add a Blog’,
               title: »,
               summary: »,
               content: »
           }
       }
       …
   }

И если вы используете плагин wysihtml5 для контента, вы заметите, что ранее мы нацелены на все элементы <textarea> :

1
this.$el.html(this.template(attributes)).find(‘textarea’).wysihtml5();

Давайте дадим контенту класс textarea и нацелимся только на него с помощью плагина wysihtml5.

В #write-tpl :

1
<textarea name=»content» class=»form-control write-content» rows=»20″>{{{content}}}</textarea>

В функции WriteBlogView.render() :

1
this.$el.html(this.template(attributes)).find(‘.write-content’).wysihtml5();

Теперь это работает!

Резюме в WriteBlogView

Поиграйте с новой страницей записи блога, добавьте несколько постов в блоге со сводкой и извлекайте сводку вместо содержимого в #blogs-tpl :

1
2
3
4
5
6
7
{{#each blog}}
   <div class=»blog-post»>
       <h2 class=»blog-post-title»><a href=»#»>{{title}}</a></h2>
       <p class=»blog-post-meta»>At {{time}} by {{authorName}}</p>
       <div>{{summary}}</div>
   </div>
   {{/each}}

Найдите минутку и подумайте, как бы вы добавили страницу /blog/:id для отображения содержимого каждого поста в блоге, и попробуйте сделать это самостоятельно. Вы должны быть в состоянии сделать все это самостоятельно сейчас!

Но для целей этого урока позвольте мне кратко рассказать вам:

Добавьте новый HTML-шаблон для этой страницы:

1
2
3
4
5
6
7
<script id=»blog-tpl» type=»text/x-handlebars-template»>
       <div class=»blog-post»>
           <h2 class=»blog-post-title»>{{title}}</h2>
           <p class=»blog-post-meta»>At {{time}} by {{authorName}}</p>
           <div>{{{content}}}</div>
       </div>
   </script>

Добавьте новый класс BlogView который принимает объект blog , и отобразите его в #blog-tpl :

1
2
3
4
5
6
7
BlogView = Parse.View.extend({
       template: Handlebars.compile($(‘#blog-tpl’).html()),
       render: function() {
           var attributes = this.model.toJSON();
           this.$el.html(this.template(attributes));
       }
   }),

Добавьте новый шаблон URL в BlogRouter :

1
2
3
4
5
routes: {
       …
       ‘blog/:id’: ‘blog’,
       …
   }

А в функции BlogRouter.blog() получите блог по его идентификатору, визуализируйте blogView и поместите его в $container :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
blog: function(id) {
       var query = new Parse.Query(Blog);
       query.get(id, {
           success: function(blog) {
               console.log(blog);
               var blogView = new BlogView({ model: blog });
               blogView.render();
               $container.html(blogView.el);
           },
           error: function(blog, error) {
               console.log(error);
           }
       });
   }

Наконец, обновите ссылку в #blogs-tpl чтобы перейти на эту страницу:

1
2
3
4
5
6
7
{{#each blog}}
   <div class=»blog-post»>
       <h2 class=»blog-post-title»><a href=»#/blog/{{objectId}}»>{{title}}</a></h2>
       <p class=»blog-post-meta»>At {{time}} by {{authorName}}</p>
       <div>{{summary}}</div>
   </div>
   {{/each}}

Дайте ему попытку:

blogView

Дополнительные очки, если вы сделали это самостоятельно.

В этом сеансе вы многое создали: функция удаления, функция выхода из системы и другой новый тип страницы. Если вы читали эту серию руководств до сих пор, я думаю, у вас есть четкое понимание того, как база данных, модель, представление, шаблон и маршрутизатор работают вместе. Я надеюсь, что вы также начинаете получать удовольствие от создания проекта Parse.js на этом этапе. Оставьте мне свой отзыв и дайте мне знать, если это полезно.

На этой единственной странице поста в блоге, которую мы создали на этот раз, мы добавим раздел комментариев в следующий раз. Должно быть весело. Будьте на связи!