2011-02-23 3 views
146

Backbone.js를 시험해보고 있는데, 원격 API를 호출하는 것이므로 the documentation을 이해하면 Backbone.sync를 재정의 할 수 있어야합니다.Backbone.sync를 재정의하는 방법?

문서 자체에서이를 수행하는 방법에 대한 예제가 없으며 백본에 대한 Google 그룹이없는 것으로 나타났습니다 ... 누군가가 이것을 수행하는 예를 지적 할 수 있습니까?

+4

Google 그룹이 없으면 freenode의 #documentcloud room을 확인하고 질문을하십시오. 대답을 얻는다면 여기로 돌아와서 자신의 질문에 대답하십시오. 거기에는 많은 훌륭한 토론이 있으며, 그것을 체계화하고 이후에 오는 사람들을 검색 할 수있게하는 것이 좋습니다. –

+3

FYI : http://groups.google.com/group/backbonejs –

답변

225

그들이 로컬 스토리지의 대안 Backbone.sync을 덮어이 주석 소스의 예를 살펴

backbone-localStorage

기본적으로 Backbone.sync 4 개 인수를받는 함수이어야한다 :

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

당신을 method의 성공 여부에 따라 options.success 또는 options.error 중 하나를 실행해야합니다. 방법은 형식에 있습니다

  • "create" : 당신이
  • "read" 서버의 모델을 만드는 것이 예상 : 서버에서이 모델을 읽고 그것을
  • "update"를 반환 할 것으로 예상 : 예상이 업데이트하는 것이
  • "delete" 인 서버의 모델 : 서버에서 모델을 삭제해야합니다.

당신은 그 4 개 메소드를 구현하고 이들 만 Backbone.sync 구현해야하는 것들 물론 당신의 "server"

을 위해 원하는대로 정의 할 필요가있다. methods을 더 구현할 수 있으며 더 많은 매개 변수를 success에 다시 전달할 수 있지만이 방법을 사용하지 않는 것이 가장 좋습니다.

Backbone.sync과 똑같은지 확인하는 것이 가장 좋으므로 구현보다는 인터페이스로 프로그래밍하십시오. 아웃 전환 할 경우

[편집] 또한

은 당신이 할 수 있습니다 않습니다 당신이되지 않습니다 로컬 스토리지를 하나의 확장 된 Backbone.sync "를 일치하도록 스스로를 확장 할 말에 대한 Backbone.sync 수정 sync의 여러 구현을 사용 Backbone.sync에 대한 모든 참조 actaully (this.sync || Backbone.sync) 그래서 그냥 같은 것을 할 필요가 :.

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

    "sync": myOwnSpecificSync, 

    ... 
}); 

Backbone.sync 모든 모델은 일하지 않는 한 사용 단지 기본 전역이다 e 모델에는 sync 메소드가 특별히 설정되어 있습니다.

+2

모델을 localStorage에서 가져오고 다른 하나가 서버에서 가져 오도록하려면 어떻게해야합니까? 그게 아직 가능하니? – picardo

+19

'(this.sync || Backbone.sync)'편집을 참조하십시오. 추가 팁은 백본의 주석 소스를 읽는 것입니다. 그것은 모두 거기에있다! – Raynos

+0

정말 대단합니다. 정말 고맙습니다. – picardo

15

이 답변은 조금 늦었고 @Raynos의 답변은 훌륭하지만 조금 다르게 해본 결과 여러분이나 다른 사람이 API를 사용하려고 할 때 유용 할 수도 있습니다. 등뼈.

Backbone.sync를 재정의하는 대신 Ajax 요청이 있었기 때문에 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 메소드를 오버라이드 (override) 할 필요가 :

다음은 예입니다. 일반적인 구현 방법은 다음과 같습니다.

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

그 모델 또는 컬렉션으로 이동합니다. –

+2

부전공자 제안 : 마지막 줄을'Backbone.sync.apply (this, arguments); '로 변경하는 것은 어떨까요? 예를 들어, "sync"의 재정의 된 버전에서 "options"인수를 생략하려는 경우 약간 더 유연합니다. – Lochlan

+0

이 질문에 대한 미래의 발견자를 위해 뭔가 다른 것들이 있습니다 : _ 반드시 Backbone.sync_a la를 반환하십시오 http://backbonejs.org/docs/backbone.html#section-62 – Lochlan

관련 문제