Статьи

Начните строить свой блог с Parse.js: Комментарии

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

Эта серия учебников подходит к концу. Если вы следили до сих пор, надеюсь, у вас есть четкое понимание инфраструктуры MVC и того, как работает Parse.js. На прошлой сессии мы реализовали удаление, выход из системы и просмотр отдельного блога. И в этом сеансе мы собираемся добавить область комментариев к просмотру одной страницы.

Раздел комментариев будет состоять из двух частей: форма комментария вверху и список комментариев к этому сообщению в блоге внизу:

исход

Поскольку вы уже создали так много функций, я собираюсь немного ускорить и сгруппировать контент в три больших шага:

  1. Создайте модель комментария.
  2. Обновите BlogView
  3. Добавьте форму комментария.

Модель всегда на первом месте. Давайте продолжим и создадим новый класс на Parse.com.

Этот новый класс комментариев должен иметь следующие поля:

  • Указатель blog
  • Строка authorName
  • Строка email
  • Строковый content

Указатель указывает на сообщение в блоге, к которому он принадлежит, а остальные три поля содержат ключевую информацию для этого комментария. Ради этого урока я не собираюсь приглашать пользователя и входить в него, но вы можете прочитать документацию Parse.js в классе User для получения более подробной информации.

Далее, давайте создадим модель Comment в нашем файле blog.js Вы заметите, что это очень похоже на модель Blog мы создали. Единственное отличие состоит в том, что мы не разрешаем пользователям редактировать свои комментарии позже, поэтому мы используем функцию .add() вместо функции .update() . Опять же, не стесняйтесь сделать его редактируемым, если хотите.

1
2
Comment = Parse.Object.extend(‘Comment’, {
})

Переходя к представлению, поскольку у нас есть этот раздел комментариев в BlogView , мы можем также отобразить комментарий в BlogView . Мы просто поместим это в .render() .

Сначала нам нужно получить комментарии к текущему блогу:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
render: function() {
    var self = this,
        attributes = this.model.toJSON(),
        // A new query to filter out all the comment in this blog
        query = new Parse.Query(Comment).equalTo(«blog», this.model).descending(‘createdAt’),
        // Create a collection base on that new query
        collection = query.collection();
    // Fetch the collection
    collection.fetch().then(function(comments) {
        // Store the comments as a JSON object and add it into attributes object
        attributes.comment = comments.toJSON();
        self.$el.html(self.template(attributes));
    });
}

Обратите внимание, что мы добавляем .descending('createdAt') к запросу, чтобы мы всегда отображали последний комментарий вверху.

Если мы зарегистрируем attributes непосредственно перед его рендерингом, мы увидим, что объект будет структурирован так:

1
2
3
4
5
6
7
8
{
    ACL: Object,
    author: Object,
    authorName: «moyi»,
    comment: Array[2],
    …
    __proto__: Object
}

И вы можете видеть, что комментарии хранятся в виде массива и готовы к визуализации.

Теперь у нас есть комментарии, переданные в наш HTML-шаблон в attribute , теперь мы можем перебрать массив с помощью синтаксиса handlebar.js:

01
02
03
04
05
06
07
08
09
10
11
12
<!— Comments —>
{{#if comment}}
<h2>Comments</h2>
<ul class=»blog-comments list-unstyled»>
    {{#each comment}}
    <li class=»blog-comment»>
        <div><a href=»mailto:{{email}}»>{{authorName}}</a> said:</div>
        <div>{{content}}</div>
    </li>
    {{/each}}
</ul>
{{/if}}

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

Тестовый комментарий

Затем мы можем перейти к добавлению формы комментариев.

Добавьте эту структуру HTML прямо над разделом комментариев:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<!— Comment Form —>
<h2>Leave a Comment</h2>
<form class=»form-comment» role=»form»>
    <div class=»form-group»>
        <label for=»comment-author-name»>Name</label>
        <input name=»authorName» type=»text» class=»form-control» id=»comment-author-name» placeholder=»Your name»>
    </div>
    <div class=»form-group»>
        <label for=»comment-email»>Email address</label>
        <input name=»email» type=»email» class=»form-control» id=»comment-email» placeholder=»Your email»>
    </div>
    <div class=»form-group»>
        <label for=»comment-content»>Comment</label>
        <textarea name=»content» class=»form-control» rows=»3″ id=»comment-content»></textarea>
    </div>
    <button type=»submit» class=»btn btn-default»>Submit</button>
</form>

Теперь давайте добавим событие в BlogView :

1
2
3
events: {
        ‘submit .form-comment’: ‘submit’
}

А затем создайте функцию submit() . Если вы все еще помните, как мы написали функцию отправки для WriteBlogView , это очень похоже.

Просто обратите внимание, что на этот раз мы должны передать this.model качестве blog для нового комментария:

01
02
03
04
05
06
07
08
09
10
11
submit: function(e) {
    e.preventDefault();
    var data = $(e.target).serializeArray(),
        comment = new Comment();
    comment.add({
        blog: this.model,
        authorName: data[0].value,
        email: data[1].value,
        content: data[2].value
    });
}

Дайте ему тест, и, конечно же, новый комментарий теперь отображается вверху:

Новый комментарий

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

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