0

単純な「カウンター」アプリケーションを使用して、backbone.jsとcouchdbで作業を開始し、ロープを学習しました。localstorage を使用するバージョンはここにあります: demo fiddle。増減可能なカウンターを表示するシンプルなアプリです。カウンターの値はデータベースに保存されます。参照されているバージョンでは、問題なく動作するように見える localstorage を使用しています。

私の例をcouchdbを使用するように変換すると、問題が発生します。したがって、couchapp を作成し、backbone-couchdb コネクタで動作するようにコードを調整しました。また、db config 属性も含めました (ここで説明したように)。コードの関連する (適応された) 部分を以下に示します (要は 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アダプターを使用する場合localStorage、コレクションに属性を指定する必要があります。これは、URL を入力する唯一の場所です (実際、コレクションのルート 1)。ただし、このアダプターを使用せずにモデルを同期しようとすると、コレクションに URL がないため、このモデルには URL が必要になります。コレクションに URL プロパティを提供するときは正しいですが、それは個々のモデルを同期するときではなく、コレクション全体を同期するときに使用されます。

それを機能させるには、モデルの URL を指定するか (単なる文字列ではなく関数にすることができることを思い出してください)、urlRoot属性を使用することができますurlRoot。これが「コレクションの URL」として理解されるものです (を追加しますid)。urlRootがあり、の/countersモデルがあった場合、最終的な URL (自動的に実行されます) は、たとえば になります。id1/counters/1

編集:

CouchDB に関するものではありませんが、この質問を確認していない場合は確認できますが、問題に光を当てる可能性があります:バックボーンで単一のモデルを取得するにはどうすればよいですか?

于 2012-12-25T20:01:21.363 に答える