在Collection.create中获取错误:未捕获错误:必须指定“url”属性或函数

时间:2013-01-03 07:22:05

标签: javascript backbone.js

我有一个模特

var TodoModel = Backbone.Model.extend({
    defaults: {
        title : '',
        completed: false
    }
});

当我尝试使用Collection.create方法将此模型添加到集合时,我收到错误

  

未捕获错误:必须指定“url”属性或函数

我尝试了以下方式

var TodoCollection = Backbone.Collection.extend({
    model : TodoModel,
});

todoCollection.create({title:'Try out code examples', completed:true});

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

如果要创建模型/集合 - 默认情况下,您必须为资源指定URL。你可以这样做:

var TodoModel = Backbone.Model.extend({
    defaults: {
        title : '',
        completed: false
    }
});

var TodoCollection = Backbone.Collection.extend({
    url: '/todos',
    model : TodoModel,
});

有关详细信息,请参阅http://backbonejs.org/#Collection-url

我认为这里的混乱来自Backbone.js的Todo示例,该示例使用本地存储(http://documentcloud.github.com/backbone/docs/backbone-localstorage.html)。如果跳到本地存储代码的底部,则可以看到 Backbone.sync 已设置。通过这样做,我们更改了创建模型的默认行为,使其不再需要Url。在大多数骨干应用程序中,情况并非如此,并且需要服务器端URL才能使模型工作。

答案 1 :(得分:1)

这是因为destroy()函数也会调用Backbone.sync来更新服务器,而不仅仅是前端的模型。 http://backbonejs.org/#Model-destroy

因此,如果您使用REST来同步数据,则需要在模型中设置url属性,以便Backbone知道发送请求的位置:

Backbone.Model.extend({
    url: "http://myapi.com/"
})

为了更灵活,您还可以设置urlRoot:http://backbonejs.org/#Model-urlRoot

或者你可以添加

 Backbone.sync = function(method, model, success, error){
    success();
  } 

使用您的代码。