2013-06-03 4 views
10

사진 및 앨범이 포함 된 백본에서 병합 된 컬렉션이 있습니다.Backbone.js : 동일한 ID를 가진 여러 모델을 포함한 컬렉션

이들을 구별하기 위해 type 필드를 추가했습니다. photo 또는 album입니다. 내가 컬렉션을 채울 때, 나는 Collection#model 방법 내에서 서로 다른 모델을 만들

model: (attrs, options) -> 
    switch attrs.type 
     when 'album' then new App.Models.Album(attrs, options) 
     when 'photo' then new App.Models.Photo(attrs, options) 

사진과 같은 ID와 앨범을 추가 할 경우 지금은 이상한 버그를 연구해 왔습니다 병합의 결과 (의이 2을 가정 해 봅시다).

나는 이것을 소스 코드에서 these LOC로 추적했다. Backbone 자체를 만들지 않고는 되돌릴 수없는 것처럼 보입니다. 나는 그것을 시도했다 그러나 또한 fails 35 tests.

  1. 내가 ID에 접두사를 추가 할 수 있습니다

    나는, 내가 하나 더 그들 중 어떤 모르는이 일의 4 개 가지 방법을 생각했다. photo_2을 예로 들어 보겠습니다. 이로 인해 백엔드가 변경되고 프런트 엔드의 일부 변경 사항이 서버에 충돌하지 않습니다. /photos/photo_2
  2. 백본 및 change these LOC를 포킹 할 수 있습니다.
  3. 나는 두 개의 별도의 컬렉션을 만들 수 있지만, 병합 및 뷰의 종류를 처리 할 수 ​​
  4. 내가의 사진이 부착 된 신분증과 함께 시작할 수
  5. (클라이언트의 성능에 영향을 미친다 및 백엔드의 재 작성 필요),의는 1000000을 가정 해 봅시다 . 이렇게하면 주어진 ID로 사진을 업로드 한 사용자가 동일한 ID로 앨범을 만들 가능성이 크게 떨어집니다.

답변

7

버전 1.2 이후로 당신이 컬렉션 고유 모델을 식별하는 방법을 지정할 수 Collection.modelId를 사용할 수 있습니다. 귀하의 경우 유형을 다른 ID가 있는지 확인하려면 다음을 수행 할 수 있습니다.

var MyCollection = Backbone.Collection.extend({ 
    modelId: function (attrs) { 
     return attrs.type + "-" + attrs.id; 
    } 
    // ... 
    }) 
+0

모델을 속성이 아닌 인수로 가져 오는 방법이 있습니까? –

7

난 당신이 다음을 추가, 앨범과 사진이 모두 그 제안 :

idAttribute: 'uniqueId' 
    parse: function(response) { 
    response.uniqueId = type+'_'+response.id 
    return response; 
    } 
관련 문제