Я пытаюсь написать парсер XMPP, который будет управлять некоторыми моделями Ember Data. Информация поступает асинхронно, поэтому AFAIK не вписывается в шаблон адаптера. Во многих случаях я могу получить немного информации, и я хочу частично обновить модель, основываясь на этом.
Например, приходит сообщение о присутствии, я хочу сохранить его, чтобы создать историю статусов, но я также хочу найти и обновить контакт с этой новой информацией. Контакт может иметь множество других атрибутов, которые не имеют ничего общего с присутствием. Между контактом и моделью присутствия существует связь один ко многим.
На данный момент у меня есть код, который выглядит примерно так:
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);
}
Когда приходит новое сообщение о присутствии, если контакт не существует, он создаст его и правильно построит связь, используя метод load. Однако, если я хочу добавить запись присутствия в историю наличия, использование set
не работает. Интересно, что set
работает, когда имеет дело со стороной Присутствия.
Я обнаружил, что это можно сделать с помощью:
...
contact.get('presence_history').addObject(this);
...
Это добавляет объект, но не вызывает обновлений ни у одного из наблюдателей.
Что я делаю не так?