Làm cách nào để ghi đè Backbone.sync?


145

Tôi đang dùng thử Backbone.js và một trong những điều tôi đang cố gắng thực hiện cuộc gọi đến API từ xa, vì vậy tôi cần có khả năng ghi đè Backbone.sync, vì tôi hiểu tài liệu này .

Không có ví dụ nào về cách thực hiện điều đó trong tài liệu và dường như không có nhóm google nào cho Backbone ... ai đó có thể chỉ ra một ví dụ để thực hiện việc này không?


4
Trong trường hợp không có Google Group, hãy thử kiểm tra phòng #documentcloud trên freenode và đặt câu hỏi của bạn ở đó. Chỉ cần chắc chắn quay lại đây và trả lời câu hỏi của riêng bạn nếu bạn nhận được câu trả lời. Có rất nhiều cuộc thảo luận tuyệt vời ở đó và thật tuyệt khi mã hóa nó và làm cho nó có thể tìm kiếm được cho những người đến sau bạn.
Andrew De Andrade

Câu trả lời:


225

Hãy xem ví dụ về nguồn được chú thích này, nơi chúng ghi đè lên Backbone.syncbằng một thay thế cục bộ

xương sống-localStorage

Về cơ bản Backbone.sync phải là một hàm có 4 đối số:

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

Bạn cần phải bắn options.successhoặc options.errortùy thuộc vào việc methodthành công. Các phương thức có định dạng:

  • "create" : dự kiến ​​bạn tạo mô hình trên máy chủ
  • "read" : dự kiến ​​bạn đọc mô hình này từ máy chủ và trả lại
  • "update" : dự kiến ​​bạn cập nhật mô hình trên máy chủ với đối số
  • "delete" : dự kiến ​​bạn xóa mô hình khỏi máy chủ.

Bạn cần thực hiện 4 phương thức đó và xác định bất cứ điều gì bạn muốn cho "server"

Tất nhiên đây chỉ là những điều Backbone.sync phải thực hiện. Bạn có thể thực hiện nhiều hơn methodsvà bạn có thể chuyển nhiều thông số trở lại successnhưng tốt nhất không nên làm điều này.

Tốt nhất là đảm bảo nó hoạt động giống như Backbone.synchiện tại để chương trình của bạn chuyển sang giao diện thay vì triển khai. Nếu bạn muốn tắt bản sửa đổi của mình, Backbone.synchãy nói localStorage, bạn sẽ không phải tự mở rộng nó để phù hợp với Backbone.sync mở rộng của bạn "

[Biên tập]

Cũng lưu ý rằng bạn có thể sử dụng nhiều triển khai sync. Mọi tham chiếu đều Backbone.syncđược thực hiện (this.sync || Backbone.sync)để bạn chỉ cần làm một cái gì đó như:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncchỉ là mô hình toàn cầu mặc định mà tất cả các mô hình sử dụng trừ khi các mô hình có một syncphương thức được đặt riêng.


2
Điều gì xảy ra nếu tôi muốn một mô hình tìm nạp từ localStorage, trong khi một mô hình khác tìm nạp từ máy chủ? Điều đó là có thể chưa?
picardo

19
(this.sync || Backbone.sync)Xem chỉnh sửa. Một mẹo nữa là đọc nguồn xương sống có chú thích. Tất cả đều ở đó!
Raynos

3
Chi tiết sau khi [Chỉnh sửa] về mỗi kiểu máy có đồng bộ hóa riêng là cực kỳ quan trọng! Cảm ơn!
Abel

26
+1 để đề cập đến thực tế là bạn có thể ghi đè phương thức đồng bộ hóa của một mô hình cụ thể.
Chetan

12
Chỉ cần một bổ sung: nếu bạn muốn gọi "mặc định" synctừ bất kỳ đâu trong mã của bạn (thường là quá đột ngột sync), chỉ cần làm một Backbone.sync.call(this, method, this, options).
bất đối xứng

15

Tôi biết câu trả lời này hơi muộn và câu trả lời từ @Raynos rất tuyệt, nhưng tôi đã làm nó hơi khác một chút và có thể nó sẽ hữu ích cho bạn hoặc cho bất kỳ ai khác đang cố gắng sử dụng API với Backbone.

Thay vì ghi đè Backbone.sync, tôi đã ghi đè Backbone.ajax , vì đó là nơi yêu cầu ajax được thực hiện.

Đây là một ví dụ:

// 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

Tôi thường cần ghi đè syncphương thức của đường trục khi tôi chỉ cần đồng bộ hóa các thuộc tính nhất định. Một triển khai điển hình trông như thế này:

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

và điều đó đi vào Mô hình hoặc Bộ sưu tập.
Cầu vồng Gabe

3
Gợi ý nhỏ: những gì về việc thay đổi dòng cuối cùng thành Backbone.sync.apply(this, arguments);? Nó linh hoạt hơn một chút nếu bạn, ví dụ, quyết định bỏ qua đối số "tùy chọn" trong phiên bản bị ghi đè sync.
Lochlan

Một cái gì đó khác cho những người tìm kiếm trong tương lai của câu hỏi này: đảm bảo trả lại Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Bạn có thể sử dụng Backbone.model.save(attributes, {patch: true})để thực hiện cập nhật một phần ngay bây giờ
roborourke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.