Использовать динамический URL для Backbone Collection - PullRequest
7 голосов
/ 31 мая 2011

Backbone настраивает URL один раз для всех при создании Коллекции.Есть ли способ изменить этот URL позже?

В следующем примере показаны 2 POST при /product и 2 POST при /product/id/stock.Последний POST не будет работать, Backbone объединит идентификатор и попытается PUT его, но я не знаю почему.

products.create({ name: 'American Pastoral', price: 8 });
products.create({ name: 'The Grapes of Wrath', price: 10 });

products.each(function(product) {
    var id = parseInt(product.get('id'));
    stocks.setId(id);
    stocks.create({ id: id, quantity: 12 });
}

Коллекция акций:

Backbone.Collection.extend({
    url: function() {
        return this.url;
    },
    parse : function(resp) {
        return resp.stock;
    },
    setProduct: function(id) {
        this.url = '/product/'+id+'/stock';
    }
});

Это не будет работать.

Ответы [ 3 ]

6 голосов
/ 01 июня 2011

Backbone.js будет использовать URL модели при сохранении существующих моделей. Не совсем понятно, что вы пытаетесь сделать, например, я не знаю, что такое акции. В любом случае, ваш код, вероятно, должен выглядеть примерно так, как показано ниже, и вы не должны динамически изменять URL:

Product = Backbone.Model.extend({

    url: function() {
        return '/product/' + id + '/stock';
    }

});

ProductList = Backbone.Collection.extend({

    model: Product,

    url: '/product'

}):

Backbone.js будет затем использовать URL коллекции для создания и URL модели для сохранения. Я думаю, что вам нужно оставить URL-адрес в покое и позволить стандартным функциям магистрали справиться с этим.

3 голосов
/ 06 июля 2011

Я столкнулся с тем, что по сути та же проблема.Кажется, что паттерн Backbone заключается в блокировке относительных URI в моделях и коллекциях и позволяет инфраструктуре использовать их для создания окончательного URI для данного ресурса.Это отлично подходит для шаблонов Restful URI, которые не меняются.Но в чистом сервисе RESTful вы ожидаете, что списки относительных URI будут отображаться как часть данного ресурса.Существует множество причин, по которым вам может потребоваться сделать это, очевидная причина - перемещение URI для ресурса.

Насколько я могу судить, Backbone не может легко и просто выполнить эту задачу.В вышеупомянутом вопросе мой обходной путь должен существенно переопределить метод url моделей, используя OLN.Это можно сделать при получении коллекции или при ее первоначальной инициализации.По сути, создайте логику для обработки списков URI самостоятельно.

2 голосов
/ 20 декабря 2012

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

jQuery.ajax options can also be passed directly as fetch options, so to fetch a specific page of a paginated collection: Documents.fetch({data: {page: 3}})

Объект, передаваемый параметру данных, добавляется в качестве переменной GET URL. Таким образом, URL превратился бы в URL? Page = 3 или URL? X = 1 & page = 3, если уже существовали переменные.

...