2012-12-25 25 views
0

我刚刚开始使用backbone.js和couchdb使用简单的“计数器”应用程序来学习绳索。使用localstorage的版本可以在这里找到:demo fiddle。这是一个简单的应用程序,它显示一个可以递增和递减的计数器。计数器的值存储在数据库中。在引用的版本中,我正在使用localstorage,这似乎工作得很好。Backbone-couchdb连接器错误:必须指定url属性或函数

当我将示例转换为使用couchdb时,问题出现了。因此,我创建了一个couchapp并使代码适用于backbone-couchdb connector。我还包括数据库配置属性(如提到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(); 
} 
}); 

但是,每当我递增或递减计数器,以下错误棱:“A‘URL’属性或功能必须指定”。从文档中,我明白模型从包含它的集合中获取它的URL。这似乎并非如此?我究竟做错了什么?

也许应用程序的另一个相关部分是我实例化计数器模型(它也可以在演示提琴中看到);该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

我没有使用CouchDB和Backbone.js的一起工作,但我想解决办法是比本的解释是相同的。

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

要使其工作,您可以为模型提供一个URL(请记住它可以是一个函数而不只是一个字符串),或者您可以使用urlRoot属性,而我们将会理解为urlRoot作为“Collection URL“(它将在其中添加它的id)。例如,如果urlRoot/counters,并且您的模型的id的值为1,那么最终的URL(它会帮您)将为/counters/1

编辑:

你可能在你没有的情况下检查这个问题,即使它不是关于CouchDB的,但它可能会引发对这个问题的一些光:How do I fetch a single model in Backbone?

+0

谢谢您响应。添加urlRoot属性修复了错误,但似乎没有使行为正确(即,重新启动应用程序时我没有得到持久化模型 - 但这也可能是由于其他原因)。无论如何,我对你提到的url属性感到非常困惑,因为它似乎与文档相矛盾:http://documentcloud.github.com/backbone/#Model-url还是不这样做? thx任何进一步的澄清。 –

+0

从我看到的双重检查文档后,你设置集合的url属性并认为它将成为你所需要的全部内容。然而,从我目前所了解和知道的情况来看,这个属性只有在同步整个Collection的时候才起作用(也就是说,如果你有3个使用'1','2'和'3'的模型作为id,集合将会同步他们到'root/1'等等)。但是,您的代码会单独保存模型,因此他们不知道它们是哪个集合。这就是为什么你需要在模型中提供'url'或'urlRoot'。这或多或少是文档说的^^ – Meta

相关问题