Статьи

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

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

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

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

Эта часть очень похожа на шаблон 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>

И тогда 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));
    }
})

На этот раз мы не собираемся сначала проверять и убедиться, что эта часть кода работает — в идеале вы сделали это достаточно раз, чтобы вам было удобно двигаться дальше. Всегда проверяйте предыдущие сессии или оставляйте мне комментарии, если вы чувствуете, что застряли.

Теперь давайте удостоверимся, что /edit/ будет ссылаться и отображать правильный вид редактирования.

В прошлый раз мы уже сделали часть подготовки. У нас есть шаблон 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) {}

Теперь, когда мы получили 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, проверьте их документацию .

Давайте продолжим завершать функции 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);
}

Продолжим, давайте обновим ссылки на редактирование в #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 });
}

Теперь мы можем проверить это:

blogEditView

На этом этапе тестирование может быть немного сложным, поскольку маршрутизатор еще не полностью настроен. Просто перейдите по адресу http: //localhost/your-directory/admin.html в качестве отправной точки при каждом обновлении. Мы позаботимся об этом на следующей сессии.

Мы так близки к тому, чтобы эта страница заработала. Нам просто нужно заставить EditBlogView.submit() работать.

Так же, как мы создали 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() , но вместо создания и сохранения нового блога вы сначала устанавливаете значение для текущего объекта, а затем сохраняете его.

Теперь давайте получим данные из формы в 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());
}

Попробуйте, и это должно работать!

BlogSaved

Если вы уже следовали этому уроку, действительно, молодец.

Если вам не нравится видеть идентификатор в 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-адреса могли быть статическими (это означает, что вы можете добавить его в закладки, обновить страницу или отправить другу). Много хорошего впереди, так что следите за обновлениями!