Jak zastąpić Backbone.sync?


145

Wypróbowuję Backbone.js, a jedną z rzeczy, które próbuję, jest wywołanie zdalnego interfejsu API, więc muszę mieć możliwość przesłonięcia Backbone.sync, jak rozumiem dokumentację .

W samej dokumentacji nie ma przykładu, jak to zrobić, i wygląda na to, że nie ma grupy Google dla Backbone ... czy ktoś może podać przykład, jak to zrobić?


4
W przypadku braku grupy dyskusyjnej Google spróbuj sprawdzić pokój #documentcloud na freenode i zadać tam swoje pytanie. Po prostu wróć tutaj i odpowiedz na własne pytanie, jeśli otrzymasz odpowiedź. Jest tam wiele świetnych dyskusji i fajnie jest to skodyfikować i umożliwić wyszukiwanie tym, którzy przyjdą po tobie.
Andrew De Andrade

Odpowiedzi:


225

Spójrz na ten przykład źródła z adnotacjami, w którym nadpisują one Backbone.syncalternatywą lokalnego magazynu

backbone-localStorage

Zasadniczo Backbone.sync powinien być funkcją, która przyjmuje 4 argumenty:

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

Trzeba ognia albo options.successczy options.errorw zależności od tego, czy methodsię udało. Metody są w formacie:

  • "create" : oczekiwano, że utworzysz model na serwerze
  • "read" : oczekiwano, że przeczytasz ten model z serwera i zwrócisz go
  • "update" : oczekiwano, że zaktualizujesz model na serwerze z argumentem
  • "delete" : oczekiwano, że usuniesz model z serwera.

Musisz wdrożyć te 4 metody i zdefiniować wszystko, co chcesz "server"

Oczywiście są to tylko rzeczy, które Backbone.sync należy wdrożyć. Możesz zaimplementować więcej methodsi przekazać więcej parametrów z powrotem, successale najlepiej tego nie robić.

Najlepiej jest upewnić się, że robi to samo, co Backbone.syncobecnie, aby programowanie do interfejsu, a nie do implementacji. Jeśli chcesz zmienić zmodyfikowaną Backbone.syncwersję na, powiedzmy, localStorage, nie musisz jej samodzielnie rozszerzać, aby pasowała do rozszerzonego Backbone.sync "

[Edytować]

Pamiętaj również, że możesz używać wielu implementacji sync. Każde odwołanie do Backbone.syncjest aktywne, (this.sync || Backbone.sync)więc musisz po prostu zrobić coś takiego:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncjest po prostu domyślnym globalnym, używanym przez wszystkie modele, chyba że modele mają syncspecjalnie ustawioną metodę.


2
Co jeśli chcę, aby model był pobierany z localStorage, podczas gdy inny pobierał z serwera? Czy to już możliwe?
picardo

19
(this.sync || Backbone.sync)Zobacz edycję. Kolejną wskazówką jest przeczytanie opisanego źródła kręgosłupa. To wszystko tam jest!
Raynos,

3
Szczegółowe informacje po [Edytuj] na temat każdego modelu posiadającego własną synchronizację są bardzo ważne! Dzięki!
Abel

26
+1 za wzmiankę o tym, że możesz zastąpić metodę synchronizacji konkretnego modelu.
Chetan

12
Tylko jeden dodatek: jeśli chcesz wywołać „default” syncz dowolnego miejsca w kodzie (zazwyczaj jest to overrydden sync), po prostu wykonaj Backbone.sync.call(this, method, this, options).
asymetryczny

15

Wiem, że na tę odpowiedź jest trochę za późno, a odpowiedź od @Raynos jest świetna, ale zrobiłem to trochę inaczej i może przydałoby się to Tobie lub każdej innej osobie próbującej użyć API z Backbone.

Zamiast przesłonić Backbone.sync , nadpisałem Backbone.ajax , ponieważ jest to miejsce, w którym wykonywane jest żądanie ajax.

Oto przykład:

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

Zwykle muszę zastąpić syncmetodę szkieletu, gdy potrzebuję zsynchronizować tylko niektóre atrybuty. Typowa implementacja wygląda następująco:

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

a to trafia do modelu lub kolekcji.
Gabe Rainbow

3
Drobna sugestia: co ze zmianą ostatniej linii na Backbone.sync.apply(this, arguments);? Jest to nieco bardziej elastyczne, jeśli na przykład zdecydujesz się pominąć argument „opcje” w nadpisanej wersji sync.
Lochlan

Coś jeszcze dla przyszłych poszukiwaczy tego pytania: pamiętaj, aby zwrócić Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Możesz teraz użyć Backbone.model.save(attributes, {patch: true})częściowych aktualizacji
roborourke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.