2012-05-08 2 views
9

나는 backbone.js를 시험해 보았고 새로운 모델 객체를 생성하고 나서 model.save()를 호출 할 때 방해 받았다. backbone.js 기본 동작이 데이터베이스에서 ID로 모델 개체를 업데이트하지만 예상하지 못합니다. 이 일이 일어나지 않아야합니까? json 형식의 특성을 가진 게시물을 얻고 있음을 확인했습니다. 내 서버는 json을 테이블에 저장 한 다음 새 id 필드가있는 json을 backbone.js로 반환합니다. 이 올바른지? 내 서버가 완전히 새로운 객체 또는 ID 또는 무엇을 반환해야합니까?backbone.js 저장 후 모델 개체의 ID가 업데이트되지 않습니다. 이유가 무엇입니까?

//contents of the POST from backbone.js 
    { "text":"this is a test" } 

//reply from my server 
    { id:"15", text:"this is a test" } 

내 샘플 코드는 귀하의 게시물에서 말할

var SQLRow = Backbone.Model.extend({ 
table:"", 
urlRoot:'db', 
url:function() { 
    return "/" + this.urlRoot + "?table=" + this.table + 
       "&id=" + this.attributes.id; 
    } 
}); 

var Xtra = SQLRow.extend ({ 
    table:'Xtra' 
}); 

var row = new Xtra({ 
    text: "this is a test" 
}); 

alert(row.url()); 
row.save() 
alert("row:" + row.get("id")); 
+0

저장 호출에서 반환 된 응답은 무엇입니까? – kinakuta

답변

6

거친 이하입니다. 두 가지 아이디어 :

1) 서버 응답이 성공적이지 않습니다. 저장 호출은 무엇을 반환합니까?

2) "id"속성의 이름이 ID가 아닌 다른 이름으로 지정되었습니다. 다른 이름을 설명하기 위해하는 것은 모델에 다음을 추가 : 당신은 가능성이 ID 전에 경고 화재가 돌아왔다 타이밍 문제를 직면하고

idAttribute : "MyModelsID", 

편집 할 수 있습니다.

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

대안

@mu_is_too_short가 언급 한 바와 같이, 다른 방법도 모델에 변경 내용을 듣고 이벤트에 응답하는 대신 마지막 두 줄의이 시도. (나는 가능한 한 당신의 코드에 가깝게 대답을 유지하려고 노력했다.) 당신이 수집 /이 같은 전망이없는 세계 뭔가 만드는 listenr에 있다면 그러나 다음 의사 코드 같은 일이 ... ... 당신이 시작

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

을 받거나해야

row.on('change', function() { /* do stuff */ }, this);    
+1

또는 "변경"핸들러를 모델에 바인드하고 그런 식으로'save'의 결과를 선택하십시오. 백본 (backbone)은 이벤트 중심의 프레임 워크로, 직렬 모델로 그것을 매시하려고하면 잘 작동하지 않습니다 (이 부분은 주로 Cjolly를위한 부분입니다). –

+0

@muistooshort - 그래서 우린 다시 만난다. 대안을 가져 주셔서 감사합니다. 나는 의사 코드를 대답에 포함 시켰습니다. – EBarr

+3

코드에 두 가지 문제점이있었습니다. 먼저 서버에 의해 반환 된 json 형식은 따옴표로 묶인 속성의 키가 필요합니다 (즉, {id : "ax"}는 정말로 ""id ":"ax "}이어야합니다. save가 비동기식 아약스 호출이기 때문에 저장 직후의 나의 경고는 결코 객체의 진정한 본질을 보여주지 않을 것이고 우리는 ajax와 backbone.js 처리가 완료되기 전에 항상 경고를받을 것이다. 무언가를 짧게하려면 ** 올바른 길을 제안하는 것입니다 : – Cjolly

1

이 답변은 위의 대답에서 Cjolly의 한 의견을 기반으로합니다.

그것은 서버가 JSON 문자열에서 모델의 id{ "id" : <the id> } 같은 반환, 서버에서 새로 생성 된 모델의 ID와 모델을 assiging에 Backbone.Model.save([attributes],[options]) 성공을 위해 필수적이다. ("id"이며 id이 아님을 유의하십시오). 에센스 백본에서

바르게 JSON 문자열이와 개체가 인용 키를 사용하지 않는 자바 스크립트에서 정의 할 수있는 방법과 달리, JSON은 Cjolly의 의견에 따라 이후

을 (JSON Spec - does the key have to be surrounded with quotes? 참조)을 인용 할 객체 키가 필요 기대 이것이 본질적인 문제였습니다. 나는 두 번째 대답에서이 해결책을 강조하고자합니다. 부분적으로는 똑같은 문제에 부딪혔고 의견을 읽음으로써 통찰력을 얻을 수있었습니다.

0

동일한 문제에 직면했으며 저장된 모델의 validate 함수가 실제로 백엔드에서 반환 된 모델을 무효화합니다. 그래서 내 필드가 제대로 업데이트되지 않았습니다.

0

어쩌면 약간의 시간이 걸렸을 수도 있지만, 오늘은 같은 이드가 있습니다. 서버는 새 ID가 포함 된 리디렉션으로 헤더 '위치'를 보내지 만 지속 된 객체는 반환하지 않습니다. 응답에 개체를 추가하는 것이 해결책이었습니다. Roo (Spring)가 Json-Controllers를 생성하면서 표준 객체를 반환하지 않는 것 같습니다.

관련 문제