2012-03-16 2 views
3

일부 Ember 데이터 모델을 관리 할 XMPP 파서를 작성하려고합니다. 정보가 비동기 적으로 들어 오므로 AFAIK은 어댑터 패턴에 깔끔하게 맞지 않습니다. 약간의 정보를 얻을 수있는 경우가 많이 있으며이를 기반으로 부분적으로 모델을 업데이트하려고합니다.Ember를 사용한 부분로드 데이터 및 관계

예를 들어 현재 상태 메시지가 도착하면이 상태를 저장하여 상태 기록을 만들 수 있지만이 새로운 정보로 연락처를 찾고 업데이트하려고합니다. 연락처에는 현재 상태와 관련이없는 많은 다른 특성이있을 수 있습니다. 연락처와 현재 상태 모델간에 일대일 관계가 있습니다. 순간

나는 보이는 몇 가지 코드를 갖고이 같은 비트 :

Frabjous.Contact = DS.Model.extend({ 
    primaryKey: 'jid', 
    jid:  DS.attr('jidString'), 
    ... 
    presence_history: DS.hasMany('Frabjous.Presence'), 
}); 

Frabjous.Presence = DS.Model.extend({ 
    from:  DS.attr('jidString'), 
    ... 
    contact: DS.belongsTo('Frabjous.Contact'), 
    didLoad: function(){ 
    var contact; 
    var type    = Frabjous.Contact; 
    var contact_id  = this.get('from').toString(); 
    var contact_client_id = Frabjous.Store.clientIdForId(type, contact_id); 

    if(Ember.none(contact_client_id)){ 
     // No contact exists, so create one 
     Frabjous.Store.load(type,{jid: this.get('from'), presence_history:[this.get('id')]}); 
     contact = Frabjous.Store.find(type,contact_id); 
    }else{ 
     // Update contact 
     contact = Frabjous.Store.find(type,contact_id); 

     // !!! this DOES NOT work 
     var history = contact.get('presence_history'); 
     history.addObject(this); 
     contact.set('presence_history',history); 
    } 

    // !!! this DOES work 
    this.set('contact',contact); 
    } 

새로운 존재 메시지가 접촉이없는 경우, 그것은 하나를 작성하고를 사용하여 제대로 관계를 구축 할 예정에 온다 로드 방법. 그러나 presence_history에 현재 상태 레코드를 추가하려면 set을 사용하면 작동하지 않습니다. 흥미롭게도 set은 현재 상태를 처리 할 때 작동합니다.

나는 그것을 할 수 있습니다 발견했습니다 :

... 
contact.get('presence_history').addObject(this); 
... 

이 개체를 추가,하지만 관찰자의 업데이트를 트리거하지 않습니다.

내가 뭘 잘못하고 있니?

답변

0

이론적으로 관계의 양면을 설정할 필요는 없습니다. 당신이 당신의 JSON을 변경하지 않으려면, 당신은 항상 다른를 지정하는 모델을 구성 할 수 있습니다

Frabjous.Contact = DS.Model.extend({ 
    primaryKey: 'jid', 
    jid:  DS.attr('jidString'), 
    ... 
    presences: DS.hasMany('Frabjous.Presence'), 
}); 

그리고 단순히 기록을

if(Ember.none(contact_client_id)){ 
    // No contact exists, so create one 
    Frabjous.Store.load(type,{jid: this.get('from'), presence_history:[this.get('id')]}); 
    contact = Frabjous.Store.find(type,contact_id); 
}else{ 
    // Update contact 
    contact = Frabjous.Store.find(type,contact_id); 
    this.set('contact', contact); 
} 

연결 : 규칙을 다음 시도하고 협회의 이름을 변경 당신의 협회를위한 열쇠.

또한 직접 clientIdForId을 조작하는 대신 hasReferenceForId을 사용하는 것이 좋습니다.

Frabjous.Presence = DS.Model.extend({ 
    from:  DS.attr('jidString'), 
    ... 
    contact: DS.belongsTo('Frabjous.Contact'), 
    didLoad: function(){ 
    var contact; 
    var type    = Frabjous.Contact; 
    var contact_id  = this.get('from').toString(); 
    var store    = DS.defaultStore; 

    if(!store.hasReferenceForId(Frabjous.Contact, contact_id)){ 
     // No contact exists, so create one 
     Frabjous.Store.load(type,{jid: this.get('from'), presence_history:[this.get('id')]}); 
     contact = Frabjous.Store.find(type,contact_id); 
    }else{ 
     ... 
    } 

    // !!! this DOES work 
    this.set('contact',contact); 
    }