วิธีการแทนที่ Backbone.sync


145

ฉันพยายามออก Backbone.js และหนึ่งในสิ่งที่ฉันพยายามที่จะทำให้การเรียกร้องให้ API ที่ระยะไกลดังนั้นฉันจะต้องสามารถที่จะแทนที่ Backbone.sync ที่ผมเข้าใจเอกสาร

ไม่มีตัวอย่างของวิธีการทำเช่นนั้นในเอกสารประกอบเองและดูเหมือนจะไม่เป็นกลุ่ม google สำหรับ Backbone ... ใครบางคนสามารถชี้ให้เห็นตัวอย่างสำหรับการทำเช่นนี้?


4
ในกรณีที่ไม่มี Google Group ให้ลองตรวจสอบห้อง #documentcloud บน freenode และถามคำถามของคุณที่นั่น อย่าลืมกลับมาที่นี่และตอบคำถามของคุณเองหากคุณได้รับคำตอบ มีการพูดคุยที่ยอดเยี่ยมมากมายและมันเป็นเรื่องที่ดีที่จะประมวลและทำให้สามารถค้นหาได้สำหรับผู้ที่ติดตามคุณ
Andrew De Andrade

คำตอบ:


225

ดูที่ตัวอย่างแหล่งที่มีคำอธิบายประกอบนี้ซึ่งพวกเขาเขียนทับBackbone.syncด้วยทางเลือกการจัดเก็บข้อมูลท้องถิ่น

กระดูกสันหลัง localStorage

พื้นฐาน Backbone.sync ควรเป็นฟังก์ชั่นที่รับ 4 อาร์กิวเมนต์:

Backbone.sync = function(method, model, options) { };

คุณจำเป็นต้องยิงอย่างใดอย่างหนึ่งoptions.successหรือoptions.errorขึ้นอยู่กับว่าmethodประสบความสำเร็จ วิธีการอยู่ในรูปแบบ:

  • "create" : คาดว่าคุณจะสร้างโมเดลบนเซิร์ฟเวอร์
  • "read" : คาดว่าคุณจะอ่านโมเดลนี้จากเซิร์ฟเวอร์และส่งคืน
  • "update" : คาดว่าคุณจะอัปเดตโมเดลบนเซิร์ฟเวอร์ด้วยอาร์กิวเมนต์
  • "delete" : คาดว่าคุณจะลบแบบจำลองจากเซิร์ฟเวอร์

คุณต้องใช้วิธีการทั้ง 4 วิธีและกำหนดสิ่งที่คุณต้องการ "server"

แน่นอนสิ่งเหล่านี้เป็นเพียงสิ่งที่Backbone.sync ต้องดำเนินการ คุณสามารถใช้งานได้มากขึ้นmethodsและคุณสามารถส่งผ่านพารามิเตอร์เพิ่มเติมกลับไปได้successแต่ก็ไม่ควรทำเช่นนี้

เป็นการดีที่สุดที่จะตรวจสอบให้แน่ใจว่ามันทำเช่นเดียวกับที่Backbone.syncทำอยู่ในปัจจุบันเพื่อให้การเขียนโปรแกรมของคุณไปยังอินเทอร์เฟซแทนที่จะเป็นการใช้งาน หากคุณต้องการเปลี่ยนการดัดแปลงของคุณBackbone.syncสำหรับการพูด localStorage คุณจะไม่ต้องขยายมันเองเพื่อให้ตรงกับ Backbone.sync ที่ขยาย "

[แก้ไข]

syncนอกจากนี้ยังทำทราบว่าคุณสามารถใช้หลายการใช้งานของ ทุกการอ้างอิงถึงBackbone.syncเป็น actaully (this.sync || Backbone.sync)ดังนั้นคุณต้องทำสิ่งที่ชอบ:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncเป็นเพียงค่าเริ่มต้นทั่วไปที่ทุกรุ่นใช้ยกเว้นรุ่นที่มีsyncวิธีการตั้งค่าโดยเฉพาะ


2
ถ้าฉันต้องการให้แบบจำลองดึงข้อมูลจาก localStorage ในขณะที่อีกแบบดึงข้อมูลจากเซิร์ฟเวอร์ เป็นไปได้หรือยัง
picardo

19
(this.sync || Backbone.sync)ดูการแก้ไข เคล็ดลับเพิ่มเติมคือการอ่านแหล่งที่มาของกระดูกสันหลัง มันคือทั้งหมดที่มี!
Raynos

3
รายละเอียดหลังจาก [แก้ไข] เกี่ยวกับแต่ละรุ่นที่มีการซิงค์ของตัวเองนั้นสำคัญมาก! ขอบคุณ!
Abel

26
+1 สำหรับการกล่าวถึงข้อเท็จจริงที่ว่าคุณสามารถแทนที่วิธีการซิงค์ของรุ่นที่เฉพาะเจาะจง
Chetan

12
เพียงหนึ่งนอกจากนี้ถ้าคุณต้องการที่จะเรียกว่า "เริ่มต้น" syncจากที่ใดก็ได้ในรหัสของคุณ (โดยปกติ overrydden sync) Backbone.sync.call(this, method, this, options)เพียงแค่ทำ
ไม่สมมาตร

15

ฉันรู้ว่าคำตอบนี้สายเกินไปและคำตอบจาก @Raynos นั้นยอดเยี่ยม แต่ฉันทำมันแตกต่างกันเล็กน้อยและอาจเป็นประโยชน์สำหรับคุณหรือบุคคลอื่นที่พยายามใช้ API กับ Backbone

แทนที่จะเอาชนะ Backbone.sync ฉันก็เอาชนะBackbone.ajaxเพราะเป็นที่ที่ ajax ร้องขอ

นี่คือตัวอย่าง:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

11

ฉันมักจะต้องแทนที่syncวิธีของกระดูกสันหลังเมื่อฉันต้องซิงค์คุณลักษณะบางอย่างเท่านั้น การใช้งานทั่วไปมีลักษณะดังนี้:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}

และนั่นจะเป็นโมเดลหรือคอลเล็กชัน
Gabe Rainbow

3
ข้อเสนอแนะย่อย: สิ่งที่เกี่ยวกับการเปลี่ยนบรรทัดสุดท้ายที่Backbone.sync.apply(this, arguments);? มันเป็นเรื่องเล็กน้อยที่มีความยืดหยุ่นมากขึ้นถ้าคุณยกตัวอย่างเช่นการตัดสินใจที่จะออกจาก "ตัวเลือก" syncข้อโต้แย้งในรุ่นแทนที่ของ
Lochlan

มีอย่างอื่นสำหรับผู้ค้นหาในอนาคตของคำถามนี้: อย่าลืมส่งคืน Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
คุณสามารถใช้Backbone.model.save(attributes, {patch: true})เพื่ออัปเดตบางส่วนได้ในขณะนี้
roborourke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.