2012-03-16 12 views
3

は、私はいくつかのエンバーデータモデルを管理しますXMPPパーサを書き込もうとしています。情報は非同期的に入ってくるのでAFAIKはアダプタパターンにうまく収まらない。私は少しの情報を得るかもしれない多くのケースがあり、これに基づいてモデルを部分的に更新したいと思います。例えば部分エンバーデータを使用して負荷との関係

、プレゼンスメッセージが到着すると、私はそう、私はステータスの歴史を作成することができ、これを保存したいのですが、私はまた、この新しい情報との接触を見つけて更新します。連絡先には、プレゼンスとは何の関係もない他の多くの属性が含まれている可能性があります。連絡先とプレゼンスモデルとの間には、1対1の関係があります。私は少しこのようになりますいくつかのコードを持っている瞬間

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); 
    } 

新しいプレゼンスメッセージが来るとは接触が存在しない場合は、それが1つを作成し、正しく使用して関係を構築しますロードメソッド。しかし、私はその後、動作しないsetを使用してpresence_historyに存在レコードを追加したい場合。面白いことに、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); 
    } 
関連する問題