ข้อผิดพลาดของตัวเชื่อมต่อ Backbone-couchdb: ต้องระบุคุณสมบัติหรือฟังก์ชัน url

ฉันเพิ่งเริ่มทำงานกับ 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
        });
    }

person Johan B    schedule 25.12.2012    source แหล่งที่มา


คำตอบ (1)


ฉันไม่ได้ทำงานร่วมกับ CouchDB และ Backbone.js ร่วมกัน แต่ฉันเดาว่าวิธีแก้ปัญหาจะเหมือนกับคำอธิบายนี้

เมื่อใช้อะแดปเตอร์ localStorage คุณต้องระบุแอตทริบิวต์ localStorage ในคอลเลกชันและเป็นที่เดียวที่คุณพิมพ์ URL (อันที่จริงเป็นรากสำหรับคอลเลกชัน) อย่างไรก็ตาม เมื่อไม่ได้ใช้อะแดปเตอร์นี้และพยายามซิงค์โมเดล โมเดลนี้จำเป็นต้องมี URL เนื่องจากตอนนี้คอลเลกชันไม่มีแล้ว คุณมีสิทธิ์ในการระบุคุณสมบัติ URL ให้กับคอลเลกชัน แต่จะใช้เมื่อซิงโครไนซ์คอลเลกชันทั้งหมด ไม่ใช่เมื่อซิงโครไนซ์แต่ละโมเดล

เพื่อให้ใช้งานได้ คุณอาจระบุ URL สำหรับโมเดล (โปรดจำไว้ว่าอาจเป็นฟังก์ชันและไม่ใช่แค่สตริง) หรือคุณสามารถใช้แอตทริบิวต์ urlRoot และนั่นคือ urlRoot คือสิ่งที่เราจะเข้าใจว่าเป็น "URL ของคอลเลกชัน" (โดยที่ มันจะต่อท้าย id) หาก urlRoot คือ /counters และคุณมีโมเดลที่มี id เป็น 1 ดังนั้น URL สุดท้าย (ซึ่งเหมาะกับคุณ) จะเป็น /counters/1 เป็นต้น

แก้ไข:

คุณสามารถตรวจสอบคำถามนี้ได้ในกรณีที่คุณไม่ทำ แม้ว่าจะไม่เกี่ยวกับ CouchDB แต่อาจทำให้กระจ่างเกี่ยวกับปัญหานี้: ฉันจะดึงข้อมูลโมเดลเดียวใน Backbone ได้อย่างไร

person Meta    schedule 25.12.2012
comment
ขอบคุณสำหรับการตอบกลับของคุณ การเพิ่มคุณสมบัติ urlRoot แก้ไขข้อผิดพลาด แต่ดูเหมือนจะไม่ทำให้พฤติกรรมถูกต้อง (เช่น ฉันไม่ได้รับโมเดลที่คงอยู่เมื่อรีสตาร์ทแอป - แต่อาจเป็นเพราะสิ่งอื่นด้วย) ไม่ว่าในกรณีใด ฉันสับสนมากเกี่ยวกับสิ่งที่คุณพูดถึงเกี่ยวกับคุณสมบัติ url เนื่องจากดูเหมือนว่าจะขัดแย้งกับเอกสาร: documentcloud.github.com/backbone/#Model-url หรือไม่ ขอบคุณสำหรับคำชี้แจงเพิ่มเติม - person Johan B; 26.12.2012
comment
จากสิ่งที่ฉันเห็นหลังจากตรวจสอบเอกสารซ้ำแล้วซ้ำอีก คุณคิดถูกแล้วเมื่อตั้งค่าแอตทริบิวต์ url ของคอลเลกชัน และคิดว่านี่คือทั้งหมดที่คุณต้องการ อย่างไรก็ตาม จากสิ่งที่ฉันเข้าใจและรู้จนถึงตอนนี้ คุณลักษณะนั้นจะใช้งานได้เฉพาะเมื่อซิงโครไนซ์คอลเลกชันทั้งหมดเท่านั้น (นั่นคือ หากคุณมี 3 รุ่นที่มี 1, 2 และ 3 เป็น id คอลเลกชันจะซิงโครไนซ์กับ root/1 เป็นต้น) อย่างไรก็ตาม โค้ดของคุณจะบันทึกโมเดลแยกกัน ดังนั้นพวกเขาจึงไม่ทราบว่าเป็นคอลเลกชันใด นั่นเป็นเหตุผลที่คุณต้องระบุ url หรือ urlRoot ในโมเดล ไม่มากก็น้อยตามที่หมอบอกครับ ^^ - person Meta; 26.12.2012