[javascript] Backbone.sync를 무시하는 방법?

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

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



답변

이 주석이 달린 소스 예제를 살펴보고 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특별히 설정된 방법 이없는 한 모든 모델에서 사용하는 기본 전역 입니다.


답변

나는이 답변이 너무 늦다는 것을 알고 @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);
};


답변

일반적으로 sync특정 속성 만 동기화해야하는 경우 백본의 방법 을 재정의 해야합니다. 일반적인 구현은 다음과 같습니다.

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


답변