Магистральные модели JS и URL-адреса коллекции
Если у меня есть модель под названием "Книга" и коллекция под названием "Библиотека", как показано ниже:
Книга
app.Book = Backbone.Model.extend({
defaults: {
title: 'No title',
author: 'Unknown'
}
});
Библиотека
app.Library = Backbone.Collection.extend({
model: app.Book,
url: '/api/books'
});
Когда я вызываю BookInstance.save()
, как это получается с URL-адресом для использования? Получает ли он его из коллекции?
В Backbone.model
есть 2 варианта: url
и urlRoot
. Какова цель и разница между ними?
В Backbone.collection
имеется единственный параметр url
. Всегда ли это запрос GET для RESTFUL api?
Ответы
Ответ 1
В принципе, есть 3 возможности для создания модели url:
-
Если объект модели существует в коллекции, то его метод url
возвращает адрес, состоящий из collection.url
и model.id
: [collection.url]/[id]
.
-
Если вы не хотите использовать модель внутри коллекции, то вместо фрагмента collection.url
можно использовать значение model.urlRoot
, в результате получится следующий шаблон: [urlRoot]/[id]
.
-
Наконец, если вы НЕ планируете сохранять на модели больше одной модели данного типа или будете определять URL-адреса для каждой модели при их создании, вы можете напрямую присвоить значение model.url
.
Коллекции отправляют только запросы GET - для получения массива данных JSON моделей. Для сохранения, удаления и обновления используются индивидуальные методы save()
(POST/PUT/PATCH) и destroy()
(DELETE).
Здесь исходный код Backbone.Model.url
, который должен вам помочь:
url: function() {
var base =
_.result(this, 'urlRoot') ||
_.result(this.collection, 'url') ||
urlError();
if (this.isNew()) return base;
var id = this.get(this.idAttribute);
return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id);
}
Ответ 2
В модели
- urlRoot используется для модели.
- url используется для экземпляра модели.
Итак, если urlRoot существует
то book.fetch() будет извлекать данные, указанные id, например
var Book = Backbone.Model.extend({urlRoot: 'books' });
var book = new Book({id: 1});
book.fetch(); // will get /books/1
var Book = Backbone.Model.extend({});
var book = new Book({url: 'books/1'});
book.fetch(); // will get /books/1
var Books = Backbone.Collection.extend({model: Book});
var books = new Books({ /*....*/ });
books.fetch(); // will get /books/
Вы можете ссылаться на базовый исходный код модели urlRoot здесь
Я надеюсь, что это имеет смысл для вас, удачи.