使用动态URL进行Backbone Collection

时间:2011-05-31 14:57:30

标签: url collections backbone.js

Backbone在创建Collection时为所有人配置url。有没有办法在以后更改此网址?

以下示例显示了/product处的2个POST和POST处的2个/product/id/stock。最后POST不起作用,Backbone连接id并尝试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 个答案:

答案 0 :(得分:6)

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进行保存。我认为你需要单独留下网址,让骨干网的默认功能处理它。

答案 1 :(得分:3)

我遇到了本质上相同的问题。似乎Backbone的模式是锁定模型和集合中的相对URI,并允许框架使用这些来构建给定资源的最终URI。这对于不会更改的Restful URI模板非常有用。但是在纯RESTful服务中,您可能希望相对URI的列表作为给定资源的一部分而下降。您可能需要执行此操作的原因有很多,显而易见的是,如果资源的URI移动了。

据我所知,Backbone无法轻松干净地处理这个问题。在上面的问题中,我的解决方法是基本上使用OLN重新定义模型url方法。您可以在获取集合或第一次初始化集合时执行此操作。基本上构建逻辑来自己处理URI列表。

答案 2 :(得分:2)

我知道这是一个老问题,但我花了一些时间来确定如何解决我的问题。在fetch操作下的手册中有这个小问题:

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}})

传递给data参数的对象被添加为URL GET变量。因此,如果已存在变量,则URL将变为URL?page = 3或URL?x = 1& page = 3。