2011-10-25 5 views
2

우리는 모델을 가져올 때마다 "id"속성을 설정하기 위해 Backbone.sync를 오버라이드하려고합니다. 이렇게하면 fetch()가 id로 응답하지 않아도 업데이트이 발생하고 이 아니라 다음 model.save()가 생성됩니다.Backbone.sync를 재정의합니다.

Backbone._sync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    var params = _.clone(options); 
    params.success = function(model) { 
     if(method == 'read' && model.isNew()) { 
      var id = Math.floor(Math.random()*1000); 
      model.set({ "id": id }); 
     } 
     if(options.success) options.success(model); 
    }; 
    Backbone._sync(method, model, params); 
} 

그러나 성공 함수로 전달 된 모델은 백본 모델이 아니라 단지 개체 인 것처럼 보입니다. 그래서 어떤 method (예 : model.isNew())도 사용할 수 없습니다. 내가 뭘 잘못했는지 생각해?

답변

7

Backbone.sync 대신 Model.fetch 또는 Model.parse을 덮어 쓸 수 있습니다. Backbone.sync$.ajax() 옵션을 사용하기 때문에 success 콜백은 인스턴스화 된 모델이 아닌 서버에서 JSON 응답을 수신 중입니다.

기본 Model.fetch() 콜백은 다음과 같습니다

options.success = function(resp, status, xhr) { 
    if (!model.set(model.parse(resp, xhr), options)) return false; 
    if (success) success(model, resp); 
}; 

을 여기에 당신이 의도 한대로 model는, 현재의 인스턴스를 나타냅니다. 따라서 Model.fetch을 덮어 쓰기하여 ID가없는 경우 ID를 추가하는 것이 좋습니다. model.parse()은 기본적으로 통과이며 서버 데이터를 변경하기위한 훅으로 사용됩니다. 나는 당신의 난수 ID 구현에 대해 기뻐하지 않는다. 충돌 가능성은 여전히 ​​남아있다. 특히 많은 모델을 만드는 경우 특히 그렇다. model.cid을 사용하려고 시도 할 수도있다. (충돌이있을지라도 클라이언트에서 유일 함을 보장 할 수있다. 서버가 제공하는 ID를) 또는 밑줄의 _.uniqueId()로 :

parse: function(resp, xhr) { 
    if (this.isNew() && !resp.id) { 
     resp.id = _.uniqueId('model-'); 
    } 
} 
+0

동의. 'Backbone.sync'는 전송/프로토콜에 관한 것입니다. "create", "update"등 동사를 기술에 매핑하는 작업을 덮어 씁니다. 기본적으로'Backbone.sync'는 HTTP/REST입니다. 그러나 Socket.io 또는 로컬 저장소와 같은 다른 것을 원할 경우 변경할 수 있습니다. ID로 설정 한 것과 같은 데이터로 무언가를하고 싶다면, 제안하는 것처럼 모델에서 발생해야합니다. –

+0

아주 완전한 대답, 내 문제를 해결. 고마워. –

+0

@BrianGenisio 구문 분석 및 가져 오기의 성공 콜백을 사용하는 방법을 알려주시겠습니까? 나는 파스를 사용하여 메타 데이터를 분리 한 다음 렌더링 논리를 성공으로 끌어들입니다. 하지만 model.parse를 정의하면 success 콜백 함수가 호출되지 않습니다. – BlackDivine

1

@nrabinowitz

그냥이 선명도의 작은 많은 양을 추가 할 수 있습니다. JSON을 지원하는 RedbeanPHP를 사용하고 있습니다. 한 가지 문제는 객체를 만들 때 결과 태그에 해당 객체의 새 ID를 반환하고 편집하려는 경우 새 객체에이 객체가 필요하다는 것입니다.

// My model object is a User. (we are all Users in some way). 
    var User = Backbone.Model.extend(
      { 
       url : "/user/rpc", 
       defaults: { 
        email: "email", 
        password: "", 
        admin: 0 
       },parse: function(resp, xhr) { 
           // check if the model is new, if so, set the id of this model for future requests so RedBean knows the id of this object. 
        if(this.new()){ 
        this.set({"id":resp.result}); 
        console.log(this); 
          } 
       } 

      } 
     ); 
+0

당신이 여기서 뭘하는지 보지 못합니다. 사실 내 문제는 디자인 문제였습니다. ID 서버 쪽을 생성하고 반환하는 것이 가장 좋은 방법이라고 생각합니다. 그러면 백본이 자동으로 모델에 ID를 설정합니다. 왜 전체 결과를 ID로 설정하겠습니까? 그리고 사용중인 model.new() 구문은 무엇입니까? –

관련 문제