0

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

当我将示例转换为使用 couchdb 时,问题就出现了。因此,我创建了一个 couchapp 并修改了代码以与骨干沙发连接器一起使用。我还包括了 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: function() {
        var currentCounter;
        if (theCounters.size() > 0) currentCounter = theCounters.last();
        else {
            currentCounter = new Counter();
            theCounters.push(currentCounter);
        }
        this.counterview = new CounterView({
            model: currentCounter
        });
    }
4

1 回答 1

1

我没有一起使用 CouchDB 和 Backbone.js,但我想解决方法与本说明中的相同。

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

为了使它工作,你可以为模型提供一个 URL(记住它可以是一个函数而不仅仅是一个字符串)或者你可以使用urlRoot属性,这urlRoot就是我们所理解的“集合的 URL”(它将附加它的id)。例如,如果urlRoot/counters并且您有一个带有idof的模型1,那么最终 URL(它会为您完成)将是/counters/1

编辑:

您可以检查这个问题以防万一,即使它与 CouchDB 无关,但它可能会对这个问题有所启发:如何在 Backbone 中获取单个模型?

于 2012-12-25T20:01:21.363 回答