2011-08-03 2 views
9

Backbone.js 컬렉션이 있고 모델 ID 배열을 채울 수 있습니다. 나는이 객체들을 하나씩 가져올 수 있고, 객체의 배열을 만들고 그것을 Array의 생성자로 배열로 전달할 수 있다는 것을 알고있다.객체가 아닌 객체 ID를 사용하여 백본 Collection을 초기화 할 수 있습니까?

내가 할 수있게하려면 초기 데이터로 생성자에 개체 ID 배열을 전달하고 컬렉션을 가져 와서 가능하면 일괄 처리로 this을 가져 오는 것이 좋습니다.

Doable?

답변

10

Backbone.Collection에서 '가져 오기'를 호출하면 차례대로 Backbone.sync가 호출됩니다. 기본적으로 Backbone.sync는 컬렉션에 사용하려는 URL을 묻습니다.

/models/batch/?ids=1,2,3,4 

당신이 할 수있는 무엇인가 :

var MyCollection = Backbone.Collection.extend({ 

    model: Model, 

    url: '/models', 

    initialize: function(models, options) { 
     ids = options.ids || []; 
     if (ids.length > 0) { 
      this.fetchByIds(ids); 
     } 
    }, 

    fetchByIds: function(ids) { 
     // Save a reference to the existing url 
     var baseUrl = this.url; 

     // Assign our batch url to the 'url' property and call the server 
     this.url += '/?ids=' + ids.join(','); 
     this.fetch(); 

     // Restore the 'url' property 
     this.url = baseUrl; 
    } 
}); 

그래서처럼 사용

var coll = new MyCollection({}, {ids: [1, 2, 3, 4]}); 

당신은 통과해야 할 것

그래서 서버가 응답하면 Backbone.Collection 생성자 함수는 이전에 첫 번째 매개 변수로 전달 된 모델을 설정하기 때문에 options 매개 변수의 ID 그것은 '초기화'기능을 호출합니다.

이론적으로는 정상적으로 작동해야합니다 (읽지 않음 : 완전히 시도하지 않음).

+0

대단히 감사합니다. – Joe

3

실제로 url을 함수로 설정할 수도 있습니다. fetchByIds 대신 fetch를 오버라이드하는 것뿐입니다. 또한 baseUrl은 Collection이 아닌 Model 전용입니다. 나는 rulfzid 올바른 생각을 갖고 있다고 생각하지만, 난과 같이 그것을 할 거라고 생각 :

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 

    initialize: function(models, opts) { 
    if (options.ids) { 
     this.fetch(options.ids); 
    } 
    }, 

    url: function() { 
    var url = ''; 
    if (this.fetch_ids) { 
     // pass ids as you would a multi-select so the server will parse them into 
     // a list for you. if it's rails you'd do: id[]= 
     url = '/models?id=' + ids.join('&id='); 
     // clear out send_ids 
     this.fetch_ids = undefined; 
    } else { 
     url = '/models'; 
    } 
    return url; 
    }, 

    fetch: function(args) { 
    if (args.ids) { 
     this.fetch_ids = args.ids; 
    } 
    return Backbone.Model.prototype.fetch.call(this, args); 
    } 
}); 

내가 그것을 적절한 '장소'의 기능을 유지 생각하고, 더 재사용 (즉, 당신이 가져올 수 있습니다 (LIST_OF_IDS) 언제든지 ... 당신이 가져 초기 페이지로드에 새 개체)

7

을, 당신은 사용하지 말아야 필요가 없습니다 -이 여기에 설명 reset을 사용으로 부트 스트랩해야합니다 http://documentcloud.github.com/backbone/#FAQ-bootstrap. 링크에서

:

로드 부트 스트랩 모델

앱이 처음로드, 그것은 렌더링하기 위해, 당신은 당신이 필요 해요 알고 초기 모델의 집합을 가지고하는 것이 일반적 그 페이지. 그 (것)들을 가져 오기 위하여 여분 AJAX 요구를 해고하는 대신에, 더 좋은 패턴은 그들의 데이터가 이미 페이지로 부트 스트래핑되도록하는 것입니다. 그런 다음 재설정을 사용하여 콜렉션을 초기 데이터로 채울 수 있습니다. DocumentCloud에서 작업 영역의 ERB 템플릿에서 다음과 같은 작업을 수행합니다.

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
    Projects.reset(<%= @projects.to_json(:collaborators => true) %>); 
</script>