2011-04-19 2 views
18

일부 사용자를 보유하고 있습니다. 필요한 몇 가지 정보는 전체 페이지 수, 페이지 수 등입니다. 어떻게 이러한 정보를 클라이언트로 다시 전달합니까? 또는 그들은 별도의 견해에서 왔어야 하나 이상의 아약스 전화가 필요할 것입니다. 컬렉션 fetch()을 갖고 싶고이 "메타 데이터"중 일부를 받고 싶습니다. 이것을 처리하기위한 좋은 방법은 무엇입니까?backbone.js - 요청과 함께 추가 데이터 받기

+1

자세한 정보를 제공해 주시겠습니까? 서버는 어떻게 생겼습니까? 어떤 브라우저를 지원해야합니까? 얼마나 자주 데이터를 얻습니까? – tjameson

+0

@tjameson 제 서버는 PHP를 사용하는 nginx입니다. 특정 브라우저를 지원할 필요가 없습니다 (원하는 경우 Chrome 및 Firefox 지원). 나는 데이터를 상대적으로 자주 얻는다. (단지 공정한 작업이다.) 그래서 페이지 번호를 바꾸거나 빠른 검색 등을한다. – Matthew

답변

35

여기에, 당신은 컬렉션 클래스에서이 문제를 처리해야 '구문 분석 https://github.com/ichbinadrian/maps/blob/master/templates/index.html <가 방법. 책임은 응답을 받고 일련의 모델 속성을 반환하는 것입니다. 그러나이 추가 책임이있는 구문 분석 방법에 신경 쓰지 않았다면 원하는 경우보다 더 많은 작업을 수행 할 수 있습니다.

UserList = Backbone.Collection.extend({ 

    model: User, 

    url: '/users', 

    parse: function(data) { 
     if (!data) { 
      this.registered_users = 0; 
      return []; 
     } 
     this.registered_users = data.registered_users; 
     var users = _(data.users).map(
      function(user_data) { 
       var user = {}; 
       user['name'] = user_data.name; 
       return user; 
      } 
     ); 
     return users; 
    } 
}); 

그래서 상기 단순 예에서, 서버는 등록 된 사용자와의 수와 사용자 속성들의 어레이를 포함하는 응답을 반환 추정. 구문 분석하고 사용자 특성을 반환하고 등록 된 사용자 수를 선택하여 모델의 변수로 설정하면됩니다.
구문 분석 메서드는 가져 오기의 일부로 호출됩니다. 가져 오기를 수정할 필요가 없으므로 보유하고있는 기본 제공 후크 방법을 사용하십시오.

청중들은 구문 분석 방법에 일부 사용자를 놀라게 할 수있는 2 차적 책임을 부여한다고 말합니다 (예 : 반환 및 모델 상태 수정). 그러나 이것은 괜찮다고 생각합니다.

1

이 작업을 수행하는 한 가지 방법은 Collection::fetch() 메서드를 재정 의하여 응답에서이 메타 데이터를 구문 분석하도록하는 것입니다. 당신은 당신의 백엔드이 같은 응답을 반환 할 수 :

원래 Backbone.Collection::fetch() 방법보다 우선 fetch 방법에서
{ 
    "collection": [ 
     { ... model 1 ... }, 
     { ... model 2 ... }, 
     ... 
    ], 
    "total_rows": 98765, 
    "pages":  43 
} 

, 당신은 별도로 개체의 각 속성을 처리 할 수 ​​있습니다. 다음은 약간 수정 fetch 방법으로 재정의 할 수있다 : _.extend를 사용하여이 방법은 Backbone.Collection을 확장 모든 수업에 영향을 미칠 것

_.extend(Backbone.Collection.prototype, { 
    fetch : function(options) { 
    options || (options = {}); 
    var collection = this; 
    var success = options.success; 
    options.success = function(resp) { 
     // Capture metadata 
     if (resp.total_rows) collection.total_rows = resp.total_rows; 
     if (resp.pages)  collection.pages  = resp.pages; 

     // Capture actual model data 
     collection[options.add ? 'add' : 'refresh'](
     collection.parse(resp.collection), options); 

     // Call success callback if necessary 
     if (success) success(collection, resp); 
    }; 
    options.error = wrapError(options.error, collection, options); 
    (this.sync || Backbone.sync).call(this, 'read', this, options); 
    return this; 
}); 

참고.

이렇게하면 백엔드에 2 번의 개별 호출을 할 필요가 없습니다.

+0

나는이 문제를 해결하기위한 올바른 접근 방법이라고 생각하지 않는다.대신, 당신은 물어 보는 것을 성취하기 위해 후크 방법 안에서 살고 싶습니다. 파스는 이런 종류의 일에 적절한 장소 중 하나 인 것처럼 보입니다. 프레임 워크 메서드를 재정의하면 backbone.js를 업그레이드 할 때 예상대로 작동하지 않거나 해당 메서드에 할당 된 새로운 기능을 사용할 수없는 위험이 있습니다. –

+0

맞습니다. 일반적으로 프레임 워크 프로토 타입을 상속하는 모든 메서드에 영향을 미치고 싶지는 않습니다. 어떤 이유로 나는 OP가 모든 콜렉션 클래스에서이 기능을 원했고 프레임 워크 메소드를 오버라이드하는 것이 편리한 방법이라고 생각했다. 'parse' 메쏘드는 어쨌든 이것을하기에 더 좋은 곳으로 보입니다. – Sam

0

정보를 페이지 매기기로 부트 스트랩합니다. 서버가 사이트를 생성 할 때 html 문서에 정보를 씁니다. 아약스 전화를 전혀하지 않아도됩니다. 먼저 전체 페이지를로드하지 말고 아약스 호출이 필요한 정보를 반환 할 때까지 대기하지 않도록 ordner의 전체 콜렉션을 사용합니다.

코드 파이썬 예 :

행 64 : https://github.com/ichbinadrian/maps/blob/master/python/main.py < - 여기

행 43 : - 일반적으로

관련 문제