Backbone.js sync()找不到url属性

Chr*_*son 8 backbone.js

有了这个人为的示例代码:

var Product = Backbone.Model.extend({
  idAttribute: '_id',
  url: '/rest/product',
});

var Cart = Backbone.Collection.extend({
  model: Product,
  url: '/rest/cart',
});

p1 = new Product({name: 'Keyboard'});
p2 = new Product({name: 'Mouse'});

c = new Cart();
c.add([p1, p2]);
c.sync();
Run Code Online (Sandbox Code Playgroud)

我看到Error: A "url" property or function must be specified有大量的帖子围绕着同样的错误消息,但我发现的所有帖子都是,恰当地,没有在途中定义的url属性或函数的结果.

我觉得我好像错过了某个链接步骤 - 也许我隐含地依赖于Backbone.js实际上并没有自动设置的"魔术"连接/回调/属性/属性?

mac*_*ost 7

我不认为你应该直接打电话sync; 我认为您正在寻找的是c.fetch()(或者p1.save(); p2.sav2(),取决于您尝试发送数据的方向).同步正是骨干内部使用它做它的fetch/ save(如果你想改变的AJAX细节如何确实它们,然后同步存在您覆盖,否则你不应该需要它).

如果你想方便地保存集合中的每个模型,你可以使用Underscore内置到集合方法"调用"(你应该可以做c.save(),但我想你不能):

 c.invoke('save');
Run Code Online (Sandbox Code Playgroud)


anu*_*shr 3

我首先退一步检查您的用例和您选择的模式。您显然正在尝试将产品添加到用户的购物车中。

我看到的问题是您已将购物车设为集合。我建议将购物车制作为包含产品集合的模型。

var ProductCollection = Backbone.Collection.extend({
    model : Product
});

var Cart = Backbone.Model.extend({
    url : '/rest/cart',
    defaults : {
        products : new ProductCollection()
    }
});
Run Code Online (Sandbox Code Playgroud)

使用这个新架构,您可以执行以下操作:

var c = new Cart();
c.get('products').add([p1, p2]);
c.save();
Run Code Online (Sandbox Code Playgroud)

此架构的另一个好处是您可以在购物车中包含其他数据属性,例如客户 ID、创建购物车的时间等。