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

Backbone-couchdb connector error: url property or function must be specified

本文关键字:函数 属性 连接器 错误 url Backbone-couchdb      更新时间:2023-09-26

我刚开始使用一个简单的'counter'应用程序来使用backbone.js和couchdb。使用本地存储的版本可以在这里找到:demo fiddle。它是一个简单的应用程序,显示一个可以递增和递减的计数器。计数器的值存储在数据库中。在参考的版本中,我使用localstorage,这似乎工作得很好。

当我将示例转换为使用couchdb时,问题出现了。因此,我创建了一个couchapp,并对代码进行了调整,使其与主干couchdb连接器一起工作。我还包括了db配置属性(如这里提到的)。代码的相关(改编)部分如下所示(它只是归结为包含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"属性或函数"。从文档中,我了解到模型从包含它的集合中获取它的url。这似乎不是事实吗?我做错了什么?

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

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

我没有一起使用过CouchDB和Backbone.js,但我猜解决方法与本解释相同。

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

为了使它工作,你可以为模型提供一个URL(记住它可以是一个函数而不仅仅是一个字符串),或者你可以使用urlRoot属性,而urlRoot是我们所理解的"集合的URL"(在那里它将追加其id)。如果urlRoot/counters,你有一个id1的模型,那么最终的URL(它为你做的)将是/counters/1,例如。

编辑:

你可以检查这个问题,如果你没有,即使它不是关于CouchDB,但它可能会对这个问题有一些启发:我如何在Backbone中获取单个模型?