2015-08-03 1 views
1

У меня есть пример настройки, чтобы показать мою проблему: http://jsfiddle.net/5xo4yzw2/1/Требуется модель Backbonejs Model.url?

var root = "http://jsonplaceholder.typicode.com" 

var Post = Backbone.Model.extend({ 
    url: function(){ 
     return this.get('url') || root + "/posts/" + this.get('id') 
    } 
}); 

var Posts = Backbone.Collection.extend({ 
    model: Post, 
    url: root + "/posts" 
}); 


var posts = new Posts(); 
posts.fetch(); 
console.log("Call to collection fetch works") 

var post = new Post({id: 1}); 
post.fetch(); 
console.log("Call to collection fetch works") 

Этот пример работает, то есть, оба console.logs выполняются без исключения воспитываются по .fetch(). Это было мое понимание, однако, как от http://backbonejs.org/#Model-url, так и от книги, которую я читаю, что, как только я укажу "/posts" как URL-адрес коллекции, URL-адрес модели должен быть автоматически разрешен до [collection.url]/[id], хотя это не так. Если я не предоставляю функцию url в модели, исключение возникает при извлечении, указывая, что должен быть указан параметр url.

Я что-то неправильно понял?

ответ

2

Вы не представили свою модель в своей коллекции, для того чтобы модель могла использовать URL-адреса коллекций, которые должны быть частью этой коллекции.

Например

var post = new Post({id: 1}); 
posts.add(post); 
post.fetch(); 
console.log("Call to collection fetch works") 

Updated Fiddle

Как @Artem Baranovskii отметил, Если вы хотите использовать модель за пределами коллекции вы должны использовать свойство UrlRoot. Из documentation

Укажите UrlRoot, если вы используете модель за пределами коллекции, чтобы включить функцию URL-адрес по умолчанию для создания URL-адресов на основе модели ид. "[urlRoot]/id" Обычно вам не нужно определять это. Обратите внимание: urlRoot также может быть функцией.

+0

Итак, если мне нужна одна модель, мне нужна пустая коллекция, к которой я могу добавить ее, а затем выборку? Я полагаю, что это имеет смысл, хотя и не интуитивно понятно, что я получаю от – Eldamir

+0

Нет, как отметил в своем ответе @Artem, вы можете использовать свойство urlroot для этого. – Jack

+0

Просто для того, чтобы быть уверенным: коллекция ссылается на конечную точку моей restful службы, которая возвращает массив объектов (/ posts). Модель представляет собой представление одного объекта внутри этой коллекции. Я иногда хочу получить всю коллекцию, и иногда хочу получить только один из объектов. Должен ли я использовать urlRoot в этом случае? Мне кажется странным – Eldamir

1

Если вы используете модель за пределами коллекции вы можете использовать urlRoot как следующее:

var root = "http://jsonplaceholder.typicode.com" 

var Posts = Backbone.Model.extend({ 
    urlRoot: function() { 
     return this.get('url') || (root + "/posts/" + this.get('id')) 
    } 
}); 

var posts = new Posts(); 
posts.fetch(); 

console.log("Call to collection fetch works") 

При выполнении fetch модель пытается получить URL с помощью нескольких подходов here