2015-08-14 3 views
2

У меня есть небольшой и вполне стандартное приложение, которое:EmberJS: можно ли сохранить только измененные объекты?

  • распаковывает объектов с сервера
  • Визуализирует объектов и позволяет некоторое редактирование на них. Если это важно, это редактирование влияет только на атрибуты DS.hasMany.
  • Предложение спасительного обратно на сервер (это не должно происходить автоматически, только по запросу пользователя)

Контроллер приложения обрабатывает save события, и там я храню вещи. Код выглядит так:

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    actions: { 
     save() { 
      this.store.peekAll('object').forEach(obj => { 
       obj.save(); 
      }); 
     } 
    } 
}); 

Это вызывает запрос PUT для каждого локально загруженного объекта. Он отлично работает, но это немного грубая сила. Вместо этого я хотел бы сохранить только измененные объекты.

Я попытался с dirtyType, но он возвращает undefined внутри .forEach, а также hasDirtyAttributes, но он возвращает false всегда.

Я мог бы создать свой собственный кеш измененных объектов, но это было бы большой труд и склонность к ошибкам. Есть ли стандартный способ справиться с этой ситуацией? заранее спасибо.

ответ

5

Это прекрасно работает:

if(obj.get('hasDirtyAttributes')){ 
    obj.save(); 
} 

JSBin: http://emberjs.jsbin.com/jiqevo/1/edit?html,css,js,output

Изменение отношения не устанавливает модель, как грязная. В качестве обходного пути вы можете установить его грязным вручную, например:

this.get('model').send('becomeDirty'); 
+0

Привет, это не то, что мне нужно. Я думаю, что это свойство isDirty является истинным, когда объект еще не синхронизирован с локальным хранилищем (т. Е. Ожидает цикл события). В моем случае, когда пользователь нажимает на сохранение, все объекты были локально синхронизированы, а 'isDirty' всегда false. Мне нужно, чтобы определить, был ли объект локально изменен с момента загрузки. – bgusach

+0

@ ikaros45 Нет, это определенно, когда объект был изменен. Если вы это сделаете: setTimeout (function() {if (obj.get ('isDirty')) {console.log («Я грязный»);}}, 1000); объект будет по-прежнему грязным, т. Е. не ожидая eventloop. –

+0

@ ikaros45 Причина, по которой вы, возможно, не видите этого, потому что ember не поддерживает 'isDirty' на отношениях (пока). http://stackoverflow.com/a/32014670/29347 –

Смежные вопросы