我刚开始使用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
});
}
答案 0 :(得分:1)
我没有和CouchDB和Backbone.js一起工作,但我想解决方法与此解释相同。
使用localStorage
适配器时,您必须在Collection上提供localStorage
属性,这是您键入URL的唯一位置(实际上是Collection的根目录)。但是,当不使用此适配器并尝试同步模型时,此模型需要一个URL,因为现在Collection没有。向Collection提供URL属性时是正确的,但是在同步整个Collection时使用它,而不是在同步单个模型时使用。
要使其工作,您可以提供模型的URL(记住它可以是一个函数,而不仅仅是一个字符串),或者您可以使用urlRoot
属性,而urlRoot
是什么我们会理解为“Collection的URL”(它将附加其id
)。如果urlRoot
为/counters
并且您的模型的id
为1
,那么最终的网址(它适合您)将为/counters/1
,例如。
修改强>
你可以查看这个问题,如果你没有,即使它不是关于CouchDB,但它可能会对这个问题有所启发:How do I fetch a single model in Backbone?