2012-12-25 2 views
0

로프를 배우기 위해 간단한 '카운터'응용 프로그램을 사용하여 backbone.js 및 couchdb로 작업하기 시작했습니다. localstorage를 사용하는 버전은 demo fiddle입니다. 이 카운터는 증가 및 감소 할 수있는 카운터를 표시하는 간단한 응용 프로그램입니다. 카운터의 값은 데이터베이스에 저장됩니다. 참조 된 버전에서, 나는 잘 작동하는 것 같다 localstorage를 사용하고 있습니다.Backbone-couchdb 커넥터 오류 : url 속성 또는 함수를 지정해야합니다.

예제를 couchdb를 사용하도록 변환 할 때 문제가 발생합니다. 따라서 couchapp를 만들고 코드를 backbone-couchdb connector과 호환되도록 수정했습니다. 나는 또한 db config 속성 (언급 된 바와 같이 here)을 포함시켰다. 코드의 관련 (적응 된) 부분은 아래에서 찾을 수 있습니다 (url 속성을 포함하는 것으로 나타남). "A"URL "속성이나 기능을 지정해야합니다"나는이 증가 또는 카운터, 다음과 같은 오류 arrises을 감소 할 때마다 그러나

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(); 
} 
}); 

. 설명서에서 모델이 포함 된 Collection에서 해당 모델의 URL을 가져옵니다. 이것은 사실이 아닌 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

아마도 앱의 또 다른 관련 부분은 카운터 모델을 인스턴스화하는 곳일 것입니다 (데모 피들에서도 볼 수 있습니다). 앱 조회의 초기화 방법 :

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와 함께 일하지 않은,하지만 해결 방법이 explaination에 비해 같은 것 같다.

localStorage 어댑터를 사용하는 경우 컬렉션에 localStorage 속성을 제공해야하며 URL을 입력하는 유일한 장소입니다 (실제로 컬렉션의 루트가됩니다). 그러나이 어댑터를 사용하지 않고 모델을 동기화하려는 경우 컬렉션에 아무 것도 없으므로이 모델에는 URL이 필요합니다. Collection에 URL 속성을 제공하는 것이 맞지만 개별 모델을 동기화 할 때가 아니라 전체 Collection을 동기화 할 때 사용됩니다.

작동 시키려면 모델의 URL을 제공하거나 (모델이 String이 아닌 함수가 될 수 있음) 또는 urlRoot 속성을 사용할 수 있으며 urlRoot은 "Collection 's URL "(추가 할 곳은 id). urlRoot/counters이고 id의 모델이 1 인 경우 마지막 URL (예 : /counters/1)이됩니다.

편집 : 당신은 그것을 CouchDB를 대해 아니더라도, 당신은하지 않았다 경우에이 질문을 확인 할 수 있지만,이 문제에 대한 몇 가지 빛을 던질 수

: 대한 How do I fetch a single model in Backbone?

+0

주셔서 감사합니다 응답. urlRoot 속성을 추가하면 오류는 수정되지만 동작을 올바로 수행하지 못하는 것처럼 보입니다. 즉, 앱을 다시 시작할 때 영구 모델을 얻지 못합니다.하지만 이는 다른 이유로 인한 것일 수도 있습니다. 어쨌든, 나는 당신이 url 속성에 대해 언급 한 내용에 대해 매우 혼란 스럽다. doc과 모순 된 것처럼 보이기 때문이다 : http://documentcloud.github.com/backbone/#Model-url 또는 그렇지 않은가? 더 이상의 설명이 필요합니다. –

+0

문서를 두 번 확인한 후에 보았을 때 컬렉션의 'url' 속성을 설정하고 필요할 때가 될 것이라고 생각할 때 매우 옳았습니다. 그러나, 내가 지금까지 이해하고 알고있는 것으로부터, 그 속성은 전체 Collection을 동기화 할 때만 작동합니다 (즉,'1'','2'',''3''을'id'로 가진 3 개의 모델을 가지고 있다면 콜렉션은 동기화 될 것입니다 root/1 '로 바꾼다.그러나 코드는 모델을 개별적으로 저장하므로 컬렉션이 실제로 무엇인지 모릅니다. 그래서 모델에'url' 또는'urlRoot'를 제공해야합니다. 의사가 말하는 것은 더 많거나 적습니다 ^^ – Meta