Backbone-couchdb连接器错误:必须指定url属性或函数

时间:2012-12-25 09:25:45

标签: javascript backbone.js couchdb couchapp

我刚开始使用backbone.js和couchdb,使用一个简单的“计数器”应用程序来学习绳索。可以在此处找到使用localstorage的版本:demo fiddle。这是一个简单的应用程序,它显示一个可以递增和递减的计数器。计数器的值存储在数据库中。在引用的版本中,我使用的是localstorage,它似乎工作正常。

当我将我的示例转换为使用couchdb时,问题就出现了。因此,我创建了一个couchapp并调整了代码以使用backbone-couchdb connector。我还包括了db config属性(如上所述here)。代码的相关(改编)部分位于下面(简单地归结为包含url属性)。

var Counter = Backbone.Model.extend({

  defaults: {
    countervalue: 0
  },

  initialize: function() {
     _.bindAll(this);
  },

  increment: function() {
     this.save({countervalue: this.get('countervalue') + 1});
  },

  decrement: function() {
     this.save({countervalue: this.get('countervalue') - 1});
  }
});

var Counters = Backbone.Collection.extend({

 model: Counter,

 url : "counters",

 initialize: function() {
    this.fetch();
 }
});

但是,每当我递增或递减计数器时,都会出现以下错误:“必须指定”“url”属性或函数“。从文档中,我了解到模型从包含它的Collection中获取其url。这似乎不是这样的吗?我做错了什么?

也许应用程序的另一个相关部分是我实例化Counter模型(它也可以在演示小提琴中看到); AppView的初始化方法:

    initialize: function() {
        var currentCounter;
        if (theCounters.size() > 0) currentCounter = theCounters.last();
        else {
            currentCounter = new Counter();
            theCounters.push(currentCounter);
        }
        this.counterview = new CounterView({
            model: currentCounter
        });
    }

1 个答案:

答案 0 :(得分:1)

我没有和CouchDB和Backbone.js一起工作,但我想解决方法与此解释相同。

使用localStorage适配器时,您必须在Collection上提供localStorage属性,这是您键入URL的唯一位置(实际上是Collection的根目录)。但是,当不使用此适配器并尝试同步模型时,此模型需要一个URL,因为现在Collection没有。向Collection提供URL属性时是正确的,但是在同步整个Collection时使用它,而不是在同步单个模型时使用。

要使其工作,您可以提供模型的URL(记住它可以是一个函数,而不仅仅是一个字符串),或者您可以使用urlRoot属性,而urlRoot是什么我们会理解为“Collection的URL”(它将附加其id)。如果urlRoot/counters并且您的模型的id1,那么最终的网址(它适合您)将为/counters/1,例如。

修改

你可以查看这个问题,如果你没有,即使它不是关于CouchDB,但它可能会对这个问题有所启发:How do I fetch a single model in Backbone?