Backbone.sync를 무시하는 방법?


145

Backbone.js를 시도하고 있으며 내가 시도하는 것 중 하나는 원격 API를 호출하는 것이므로 documentation을 이해 하면서 Backbone.sync를 재정의 할 수 있어야합니다 .

문서 자체 에서이 작업을 수행하는 방법에 대한 예는 없으며 Backbone에 대한 Google 그룹이없는 것 같습니다 ... 누군가가 이것을 수행하는 예를 지적 할 수 있습니까?


4
Google 그룹이없는 경우 프리 노드에서 #documentcloud room을 확인하고 질문하십시오. 답을 얻으려면 여기로 돌아와서 자신의 질문에 대답하십시오. 거기에는 많은 훌륭한 토론이 있으며 그것을 정리하고 당신을 따르는 사람들을 검색 할 수있게하는 것이 좋습니다.
앤드류 드 안드레이드

답변:


225

이 주석이 달린 소스 예제를 살펴보고 Backbone.sync로컬 스토리지 대안으로 덮어 씁니다.

백본 로컬 스토리지

기본적으로 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로컬 스토리지와 같은 수정 된 기능을 끄 려면 확장 된 Backbone.sync와 일치하도록 직접 확장 할 필요가 없습니다. "

[편집하다]

또한 여러 구현을 사용할 수 있습니다 sync. 모든 참조 Backbone.sync(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) "default"를 호출하려면을 수행하십시오 Backbone.sync.call(this, method, this, options).
비대칭

15

나는이 답변이 너무 늦다는 것을 알고 @Raynos의 답변은 훌륭하지만 조금 다르게 했으므로 Backbone에서 API를 사용하려는 다른 사람이나 다른 사람에게 유용 할 것입니다.

대신 Backbone.sync을 무시, 나는 오버라이드 Backbone.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);?로 바꾸는 것은 어떻습니까? 예를 들어 재정의 된 버전에서 'options'인수를 제외하기로 결정하면 약간 더 유연합니다 sync.
Lochlan

이 질문의 미래 측정기에 대한 뭔가 다른 : 확실히 Backbone.sync 반환 할 수 있도록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.