2012-06-03 4 views
11

내 모델 관계와 관련하여 backbone.js 응용 프로그램을 디자인하는 방법에 어려움이 있습니다.backbone.js에서 관계를 처리하는 방법

두 개의 관계가있는 이벤트 모델이있는 경우 사용자 모델에 많은 이벤트가 있고 이벤트 모델에 많은 댓글과 참여가있을 수 있다고 말합니다. 사용자는 많은 의견을 가질 수 있으며 참여에는 한 명의 사용자와 한 명의 이벤트가있을 수 있습니다. 와우, 어떡하지?

Event has many Comments 
Event has many Participations 
Event has one User 

User has many Events 
User has many Participations 
User has many Comments 

Comment has one Event 
Comment has one User 

Participation has one User 
Participation has one Event 

좋아요, 그래서 내 생각은 사용자가 페이지를로드 할 때 이벤트 목록을로드, 그리고 이벤트에 사용자가 클릭 해당 이벤트에 대한 정보의 나머지를로드 할 때 (의견, 참여 및 사용자) .

그래서 모든 종류의 전역 변수를 사용하여 모든 이벤트, 사용자 등을 보유해야하며 서버의 정보를 가져 와서 서버에 저장하기 전에 확인하십시오. 어쩌면 일종의 localstorage에서 (그리고 어떻게 백본 관계형을 사용하여 이것을 할 수 있을까?)

내가 가진 또 다른 아이디어는 모든 이벤트에 자체 독립 데이터가 있도록하는 것입니다.이 문제는 이벤트를 클릭 할 때마다 중복 데이터를 보내 게된다는 것입니다.

어떤 방법으로 권장합니까?

감사합니다.

답변

0

이론상으로 모든 별도의 컬렉션을로드 한 다음 컬렉션에서 로컬 필터링을 사용하여 렌더링 할 때 관련 모델을 가져올 수 있습니다.

물론 보안 문제를 고려해야합니다.

적어도 내가 알기로는 정보에서 얻은 정보로 무엇을 하려는지 궁금한 것이지만 최선을 다해 답변하려고 노력할 것입니다.

제 생각에는 일부 추가 데이터가있는 일종의 이벤트가 있으며 이에 관련된 정보를 표시해야합니다.

var Events = Backbone.Collection.extend({ 
    url: '/events', // You might want to let the app return only an account's events or something, not just ALL events. 
    initialize: function(){ 
     this.fetch(); 
    } 
}); 

var Comments = Backbone.Collection.extend({ 
    url: '/comments', 
    initialize: function(){ 
     _.bindAll(this, 'getEventComments'); 
     this.fetch(); 
    }, 

    getEventComments: function(event_id){ 
     return _.filter(this.models, function(model){ return model.get('event_id') == event_id; }); 
    } 
}); 
//etc 

밑줄의 필터 기능을 사용하여 당신은 매우 신속하게 관련을 얻을 수 있습니다 : 그럼 당신은 내가 말했듯이

, 당신은이 다음을 수행 고려할 수 등의 의견을 추가 등의 작업을 수행 할 수 있어야합니다 모델을 필요할 때마다 (예 : 렌더링 할 때) 만듭니다.

이것은 서버 측 스크립팅에서와 같은 방식입니다. 일부 데이터베이스는 레코드가있는 모든 테이블을 보유하고 있으며 컬렉션이 여기에서 수행하므로 코드는 입력에 따라 관련 데이터베이스를 요구합니다.

마지막으로 필자는 항상 Require.js와 Backbone을 사람들에게 계속 지적 할 것입니다. 뻔뻔 오늘 준 대답을 다스 려, 쉽게 상관없이 생활을 할 것, 그것을 확인 : @mu_is_too_short 주석, 백본 관계형처럼 Backbone Design

18

당신이 찾고에 관심이 뭔가 될 수 있습니다. Backbone-relational을 사용하면 모델과 하위 모델 모음이 자동으로 만들어지고 이벤트가 부모 - 자식 관계를 통해 관리 될 수 있습니다.

맛보기를 얻을 수 있도록 샘플 코드를 알려 드리겠습니다. 예제 코드의 일부가 다음과 같이 보일 수 있습니다.

사용자는 많은 이벤트가 있습니다 : 당신은 백본 관계형 모델을 만들 때

User = Backbone.RelationalModel.extend({ 
    relations: [ 
     type: Backbone.HasMany, // Type of relationship 
     key: 'events',   // How we reference the sub-models in collection 
     relatedModel: 'Event', // The sub-model type 
     collectionType: 'EventCollection', // The sub-model collection 
     reverseRelation: { 
      key: 'belongsToUser'   // Key we use to refer to the parent 
     } 
    ], 
    // Other Backbone.Model properties and functions 
}); 

, 그것은 자동으로 지정하는 '키'의 이름을 따서 명명 당신을 위해 서브 모델의 컬렉션을 만듭니다. 따라서 각 사용자는 자신이 소유 한 관련 이벤트 모음을 정리할 수 있습니다.

기본적으로 사용자를 만들거나 가져올 때 필요한 관련 모델에 대한 참조를 제공합니다. 예를 들어, 사용자 ID = 1은 이벤트 5, 7 및 11이 필요할 수 있습니다. ID 만 사용하고 있습니다. 이러한 참조가 배열 형식으로 정의되는 한 Relational의 fetchRelated 메소드를 사용하여 지연 참조를로드 할 수 있습니다.

myUser = new User(); 
myUser.set({ 
    name: 'RayMysterio', 
    age: '26', 
    events: [5, 7, 11] // Or this might just come with the User object from your server 
}); 

myUser.fetchRelated('events'); 
// This will go fetch the related events for this user model from the URL you designate. 

myUser.get('events'); 
// The collection of events are treated like an attribute of the User model. 

myUser.get('events').find(function(eventModel){ 
    return // some find condition - or whatever you want to do on that collection 
}); 

특정 수신기를 하위 모델에 바인딩 할 수 있습니다.

myUser.bind('add:events', function(model, collection) { 
    // Whatever code you want to happen when new models are added to the user events coll 
}); 

등 기타

그것은 1-1, 많은 하나와 역의 관계를 생산하는 좋은 방법입니다. 이것은 꽤 중요한 열쇠입니다. 모델과 모델 사이의 관계를 정의 할 때 모델을 만듭니다.

예. 사용자 모델의 새 인스턴스를 만듭니다.

백본 관계형은 역방향 링크를 자동으로 생성합니다 (이벤트 모델에는 역방향 연관 키 'belongsToUser'(또는 사용자가 이름을 지정 함)로 정의 된 속성이 있습니다.) 이것은 모델/하위 모델을 위아래로 모델 계층 구조.

관계형 필요에 기반이 잘 맞는 것 같아. 당신이 많은 많은을 원하는 경우에

,이 (중간 모델을 사용하여) 그 일의 라운드에 대한 방법입니다하지만 내가 찾은 Paul-Uithol은 얼마 동안 Backbone-Relational을 업데이트했으며 새로운 기능이 계속 추가되었습니다. 처음에는 학습 곡선이 약간 어려웠지만 일단 시작하면 그것에 익숙해 져서 그것은 매우 편리합니다.

참고 : 강조하자면, Mosselman은 Require.js를 추천했으며이 또한 강력하게 동의합니다. 그것은 내 코드를 훨씬 관리하기 쉽게 만들었습니다. 백본 관계형 코드를 수정하여 AMD와 호환되도록 만들 수 있으며, Require로 완벽하게 작동합니다.

UPDATE : 백본 관계형 지금이 2014 년 4 월 1 일에 릴리스 0.8.8의 같은 require.js을 지원합니다 - 감사합니다 케네스

+0

이 이벤트 모델을 통해 사용자에게 이벤트를 연관 할 수 있습니까? 'myUser.set ('events', [myEvent1, myEvent2, myEvent3]);'이런 식으로 뭔가? 또는 관련 모델 ID를 통해 관계를 참조해야합니까? –

+1

@orangewarp 백본 관계형은 이제 2014 년 4 월 1 일 릴리스 0.8.8에서 require.js를 지원합니다. http://backbonerelational.org/#change-log를 참조하십시오. – Kenneth

관련 문제