2012-11-10 3 views
5

내 Backbone.js 기반 앱에서 204 상태 및 빈 본문으로 응답하는 API에 대해 이야기하고 있습니다. 포함되지 않은 콜렉션이 요청 된 경우 모든 데이터가 아직 없습니다. 이런 경우 내게 RESTful API가 응답해야하는 것은 제 의견입니다.Backbone.js 컬렉션 요청에서 204 응답을 처리하는 방법

지금 내 앱에는 204 개의 응답을받은 후에도 아무런 이벤트도 발생하지 않는 문제가 있습니다. 내가 좋아하는 resetall 결합을 시도 :

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection; 
    this.collection.bind('reset', this.render, this); 
    this.collection.bind('all', this.render, this); 
    return this.collection.fetch(); 
    }; 

을하지만 이벤트가 발생하지 않습니다. 그래서 콜백을 가져 오려고했습니다 :

FoosCollectionView.prototype.initialize = function() { 
    this.collection = new FoosCollection(); 
    return this.collection.fetch({ 
     success: function(a, b, c) { 
     debugger; 
     }, 
     error: function(a, b, c) { 
     debugger; 
     }, 
     complete: function(a, b) { 
     debugger; 
     } 
    }); 
    }; 

같은 동작입니다. 응답이 204 인 경우 디버그 문에 도달하지 않습니다. 204 응답을 어떻게 처리 할 수 ​​있습니까? 내가 sync으로 파고 들어가서 204에 대한 추가 처리를 추가해야합니까, 아니면 내가 아직 모르는 백본에 뭔가가 있습니까?

솔루션은 같은 시간에 꽤 기대하고 어색한 것 같다 들으 펠릭스

+0

를 (권장하지 않음). 그러나 거기에서 'no-content'뷰의 렌더링을 다루는 것은보기 흉한 것처럼 보입니다. – GeorgieF

+2

적어도 조금 더 우아 해 보이는 해결책을 찾았습니다. 내 컬렉션에서 구문 분석을 정의합니다. 안에는 주어진 응답이 비어 있는지 확인합니다. 그렇다면 컬렉션 모델을 []로 설정하고 차례로 재설정 이벤트를 트리거합니다. 컬렉션보기는 해당 이벤트에 바인딩되며 이후에 "내용 없음"템플릿을 렌더링 할 수 있습니다. – GeorgieF

답변

0

:이 전달 된 응답 객체가 비어 있는지, 확인하도록

은 단순히 내 컬렉션에서 parse 방법을 정의합니다. 그것은 204가 발생한 경우에만 해당됩니다. 그런 다음 parse 내부에 reset 이벤트를 발생시키는 this.collection.models = []을 설정합니다. 컬렉션보기는 해당 이벤트에 바인딩되어 있으며 this.collection.models 내부를 볼 수있는 함수를 실행합니다. 모델이 주어지지 않을 경우 표준 템플릿 대신 '내용 없음'템플릿을 렌더링 할 수 있습니다.

누군가가 더 나은 접근 방법을 가지고 있다면, 여기에 감사드립니다!

0

Backbone.js는 이러한 응답을 빈 모음으로 묶습니다. 이 문제를 해결 방법으로 사용하고 있습니다.

render: function(){ 
    if (this.collection.length == 0) { 
     console.log('empty response'); 
     // initialize with default values 
     this.collection.reset(data); 
    } 
    // do usual stuff 
} 
0

오늘 같은 문제가 발생했으며 결론적으로 내 코드가 잘못되었습니다. 코드를 수정 한 후 서버가 204 No Content으로 응답하면 success() 콜백이 호출되었습니다.

백본 : 1.2.3
jQuery를 : 2.1.4

잘못된 코드 :이 문제가 발생하는 경우 오류가에있는 경우

FooCollection = Backbone.Collection.extend({ 
    url: '/foo', 

    model: FooModel, 

    fetch: function (options) { 

    // do something. 

    // Actually, you should call `Backbone.Collection.prototype.fetch()`. 
    return Backbone.Model.prototype.fetch.call(this, options); 
    } 
}); 

그래서, 당신은 확인해야합니다 암호. 어쨌든 204 No Content 응답을 처리하려면 다음과 같은 방법이 있습니다. 내가 발견으로 컬렉션이 방법을 구문 분석에, 나는 약간의 로그인을 추가 할 수 있습니다 지금까지

initialize: function() { 
    this.collection = new FooCollection(); 

    var _this = this; 
    this.collection.fetch({ 
     success: function (collection, response, options) { 
     }, 
     error: function (collection, response, options) { 
     } 
    }).done(function (data, textStatus, jqXHR) { 
     if (jqXHR.status === 204) { 
     // do something. 
     // e.g. _this.collection.reset(); 
     } 
    }); 
    } 
관련 문제