Подтвердить что ты не робот

Магистральные модели 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?

4b9b3361

Ответ 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 здесь

Я надеюсь, что это имеет смысл для вас, удачи.