【问题标题】:Backbone-couchdb connector error: url property or function must be specifiedBackbone-couchdb 连接器错误:必须指定 url 属性或函数
【发布时间】:2012-12-11 08:22:39
【问题描述】:

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

当我将示例转换为使用 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();
 }
});

但是,每当我增加或减少计数器时,都会出现以下错误:“必须指定“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
        });
    }

【问题讨论】:

    标签: javascript backbone.js couchdb couchapp


    【解决方案1】:

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

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

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

    编辑:

    您可以检查这个问题以防万一,即使它与 CouchDB 无关,但它可能会对这个问题有所启发:How do I fetch a single model in Backbone?

    【讨论】:

    • 感谢您的回复。添加 urlRoot 属性修复了错误,但似乎并没有使行为正确(即重新启动应用程序时我没有得到持久模型——但这也可能是由于其他原因造成的)。无论如何,我对您提到的 url 属性感到非常困惑,因为它似乎与文档相矛盾:documentcloud.github.com/backbone/#Model-url 还是不是?谢谢您的进一步澄清。
    • 根据我在仔细检查文档后看到的情况,您在设置 Collection 的 url 属性并认为这就是您所需要的一切时是如此正确。但是,据我到目前为止所了解和知道的,该属性仅在同步整个集合时才有效(也就是说,如果您有 3 个模型,123id,则集合将同步他们到root/1等)。但是,您的代码单独保存模型,因此它们并不真正知道它们在哪个集合中。这就是为什么您需要在模型中提供urlurlRoot。这或多或少是文档所说的^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多