2013-04-09 3 views
2

나는 다른 단어에서이백본 JS : 자기 채우기 컬렉션

var ContactsCollection = Backbone.Collection.extend({ 
    model: Contact, 

    initialize: function() { 
      //retrieves contacts from web service 
      //contactsLoaded: is the callback that gets called after 
      //the contacts get received 
      loadContacts(this.contactsLoaded); 
    }, 

    contactsLoaded: function (contacts) { 
      for (var i = 0; i < contacts.length; i++) { 
       //TODO populate the collection [models][1] 
      } 
    } 
}); 

같은 백본 수집, 내가 자기하고 싶은 채울가 컬렉션의 models, 어떻게 이렇게 할 수 있습니까?

답변

1

을 백본 수집을 위해, 당신은 하나를 사용하여 모델을 추가 할 필요가 없습니다, 프레임 워크는 일을 할 것입니다. 서버에서 수익이 JSON의 배열이 아닌, 또는 일부 노드에 싸여 간단히

var ContactsCollection = Backbone.Collection.extend({ 
    model: Contact, 
    url: '/contacts' // whatever web service url you are using 

    initialize: function() { 
    this.fetch(); 
    } 

}); 

경우, 구문 분석 방법을 대체 할 수 있습니다.

parse: function(response) { 
    // if it's like {data: [model1, model2, model3...]} 
    return response.data 
} 
0

당신이 접촉 모델 목록에 전달하는 가정하면, (당신이 for 루프가 필요하지 않습니다)이 작업을 수행 :

this.add(contacts); 

The docs

당신이 하나의 모델 하나를 추가하거나 배열로 할 수 있습니다 언급 .

+0

나는 다음과 같은 오류를 받았습니다. TypeError : 개체가 'add'속성 또는 메서드를 지원하지 않습니다. 무엇이 잘못 될 수 있습니까? –

+0

@MinaSamy는'this'가 할당 된 것을 확인합니다. 또한 하나씩 추가 할 필요가 없다는 것을 깨달았습니다. 내 업데이트를 참조하십시오. –

2

Collection#fetch은 REST API를 사용하여 원하는대로 정확하게 처리해야합니다.

var ContactsCollection = Backbone.Collection.extend({ 
model: Contact, 
url: '', // set the URL 
initialize: function() { 
    this.fetch(); 
}}); 
0

@Loamhoof와 동의하십시오. 이 작업을 수행하려면 백본 페치를 사용해야합니다.

콜렉션을 콜렉션 initialize 메소드 외부로 가져 오는 것이 좋습니다. 나머지 응용 프로그램 제어 흐름/라우터 로직과 함께 사용하는 것이 더 명확하고 편리 할 것입니다. Fetch는 jqXHR 객체가 promise 인터페이스를 구현하도록 리턴합니다. 이 같은 일을 할 수 있도록 허용 :

var contactsCollection = new ContactsCollection({}); 
var p = contactsCollection.fetch(); 

p.done(function() { ... }); 
p.error(function() { ... }); 
p.always(function() { ... });