2012-12-25 58 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

相關問題