2013-05-31 2 views
26

Если у меня есть модель под названием «Книга» и сборник под названием «Библиотека» определяется как ниже:Магистральные JS Модели и коллекции ссылок

Книга

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?

ответ

35

В принципе, есть 3 возможности построить URL модели крупным:

  • Если объектная модель существует в коллекции, то его метод url возвращает адрес, состоящий из collection.url и model.id: [collection.url]/[id].

  • Если вы не хотите использовать модель в коллекции, то значение model.urlRoot «s может быть использован вместо collection.url фрагмента, что приводит к следующей схеме: [urlRoot]/[id].

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

Коллекции посылают только запросы GET - получить массив данных JSON моделей. Для сохранения, удаления и обновления используются методы конкретной модели save() (POST/PUT/PATCH) и destroy() (DELETE).

Here's the source code of 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); 
} 
+0

Имеет ли backbone.model, который находится внутри коллекции, свойство Backbone.Collection.url, чтобы определить URL-адрес для сохранения, обновления или удаления? –

+0

Используется для каждой операции. – mirrormx

+0

проверить [это] (http://stackoverflow.com/questions/17461264/backbonejs-model-url-using-collection-url). вы можете перезаписать настройки URL-адреса i.e yourModel.save ({url: yourModel.urlRoot + yourModel.get ("id")}); – oak

12

В модели

  1. UrlRoot используется для модели.
  2. url используется для экземпляра Модели.

Так что если UrlRoot существует то книга.выборки() будет получать данные, приведенные идентификатор, например

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 код here

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

Смежные вопросы