2012-05-14 2 views
7

Backbone.js를 배우기 시작했고 this boilerplate으로 시작하여 디스크의 정적 파일에서 JSON 데이터를로드하고 HTML 테이블에 표시하여 예제를 만들었습니다 .Backbone.js 모델의 destroy 메소드가 성공 또는 오류 이벤트를 발생시키지 않습니다.

그런 다음 컬렉션에서 요소를 삭제 한 다음 DOM에서 요소를 삭제해야하는 단추에 이벤트를 바인딩하려고했습니다. 건은 remove 이벤트가 컬렉션 트리거, 클릭이 destroy 방법을 트리거, 잘 작동하지만 아무 단서가 destroy

누구의 success 또는 error 콜백에서 온다?

모델 :

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone) { 
    var memberModel = Backbone.Model.extend({ 
    url: "/members.json", 
    defaults: { 
     email: "", 
     firstname: "", 
     lastname: "", 
     gender: "", 
     language: "", 
     consent: false, 
     guid: "", 
     creationDate: "" 
    }, 
    initialize: function(){ 
    } 

    }); 

    return memberModel; 

}); 

뷰 :

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'mustache', 
    'collections/members', 
    'text!templates/members/page.html' 
], function($, _, Backbone, Mustache, membersCollection, membersPageTemplate){ 
    var membersPage = Backbone.View.extend({ 
    el: '.page', 
    initialize: function(){ 
     this.members = new membersCollection(); 

     this.members.on('remove', function(){ 
       // works fine 
      $('.members-body tr').first().remove(); 
      console.log('removed from collection'); 
     }); 
    }, 

    render: function() { 
     var that = this; 

     this.members.fetch({success: function(){ 

      var wrappedMembers = {"members" : that.members.toJSON()}; 

      that.$el.html(Mustache.render(membersPageTemplate, wrappedMembers)); 

      $('#delete-member').click(function(){ 
       that.members.at(0).destroy({ 
         // prints nothing!!! 
        success: function(){ console.log('sucess'); }, 
        error: function(){ console.log('error'); } 
       }); 

      }); 

     }}); 

    } 
    }); 
    return membersPage; 
}); 
+0

모델이나 컬렉션에 대해 'url'세트가 있습니까? –

+0

예, 모델 및 컬렉션 모두에 'url'이 설정되어 있습니다. – MaxiWheat

답변

7

나는이 이상한 것을 동의합니다. 아직 무슨 일이 벌어지고 있는지 잘 모르겠지만 여기에 내가 의심하는 바가 있습니다 ...

Destroy() 호출이 유효한 JSON을 반환하지 않습니다.

  • firebug, fiddler 또는 무엇이든지보고있는 중, destroy() 응답은 어떻게 생겼습니까?
  • 나는 또한 that 당신의 delete-click 기능이 방아쇠를 당길 때가 흥미 롭다.
  • destroy가 false 또는 jqXHR 객체를 반환합니까?

백본에 약간의 연결이 끊어졌습니다 (적어도 처음에는 나를위한 것이 었습니다). 해당 번호로 destroy()을 호출하거나 페치/저장하면 호출은 비동기입니다. 호출 직후 delete 이벤트가 발생하고 콜렉션이 응답 할 수 있습니다. 그러나, 문서에 깊은 조금 파고, 또 다른 이벤트는 삭제 확인 해고되어 모델의 삭제 후

는 "동기화"이벤트, 을 서버가 인정 성공적으로

그래서 컬렉션이 삭제가 성공했다고 가정합니다. 컬렉션이 확인 된 삭제에 응답하게하려면 sync 이벤트를 찾으십시오.

이렇게하면 잔소리가 하나 남습니다. 오류 처리기가 실행되지 않는 이유는 무엇입니까? 음, 콜백은 삭제 확인에 응답하도록 설계되었습니다. 하지만 JS 호출 스택은 성공 또는 오류로 돌아 오는 응답을 해석하는 방법을 모르겠습니다. 아마 AJAX의 현실을 우연히 발견했을 것입니다. 백본, jquery 및 다른 프레임 워크에서 ajax 오류 처리를 혼동 할 수 있다는 사실을 발견했습니다. Google "jquery ajax error not called"오류 이벤트가 발생하지 않는 다양한 시나리오가 있습니다.


앞뒤로 코멘트 후

UPDATE ... 두 가지 일이있다.첫째, 모델이 '새로운 것'으로 인식되어 Destroy()에 대한 호출이 서버 요청을하지 않음을 의미합니다. 결과적으로 성공/오류가 발생하지 않습니다. this commit을 참조하십시오.

나는 당신이 당신의 모델을 새로운 것으로 생각하지 않는다고 생각한다. 당신은 두 가지 중 하나를해야합니다. 모델 ID에 id또는이라는 특성을 모델 ID (guid 가정) 모델 맵에 포함 시키십시오. 모델에 다음 줄을 적용하면 쉽게 매핑 할 수 있습니다. idAttribute: "guid". idAttribute here에서 자세한 내용을 볼 수 있습니다.

+0

Google 크롬에서 테스트 중이며 네트워크 탭을 보면'destroy'를 호출해도 아무런 반응이 없습니다. DELETE http 요청이 전송되었는지 확인하기 위해 Fiddler도 시도했지만 거기에도 아무 일도 일어나지 않았습니다. – MaxiWheat

+0

원래 정의에 모델 정의를 추가하십시오 (가져온 JSON 응답 포함). 또한, 삭제하기 바로 전에'that.members.at (0) .IsNew'의 값은 무엇입니까? – EBarr

+0

또한이 줄'this.members = new membersCollection;은 홀수입니다. 나는 직접적인 assigment를 기대하거나'membersCollection()'뒤에'new' 괄호를 사용하는 경우 – EBarr