2013-07-26 4 views
0

У меня есть простой SPA-сервис с бризом/нокаутом. Мне пришлось реализовать опцию «single save» для списка сущностей - редактирование должно было быть сделано в списке не в отдельном всплывающем окне.субъект клиента breeze, не обновляющийся после изменений на стороне сервера

При сохранении сервера будет проверяться, что были обновлены только определенные attrs объекта, а также обновлена ​​«последняя обновленная дата» attr.

Список сущностей был выведен с сервера одним диспетчером сущностей.

Для включения единого сохранения обновленная и готовая к сохранению сущность экспортировалась из главного диспетчера объектов и импортировалась во временный диспетчер объектов. Сохранение выполняется и (если все в порядке) объект реэкспортируется и импортируется обратно в главный диспетчер объектов.

function saveSingle(entity) 
{ 
    var tempMgr = MainEntityManager.createEmptyCopy(); 
    var exp = MainEntityManager.exportEntities([entity]); 
    tempMgr.importEntities(exp, { 
     mergeStrategy: breeze.MergeStrategy.PreserveChanges }); 
    tempMgr.saveChanges() 
    .then(function (saveResult) { 
     var reImp = tempMgr.exportEntities(); 
     MainEntityManager.importEntities(reImp); 

     entity.Last_Updated_Date(saveResult.entities[0].Last_Updated_Date()); 
     entity.entityAspect.entityState = breeze.EntityState.Unchanged; 

     logger.success("changes saved"); 
    }) 
    .fail(function() { 
     logger.error("Single Save failed: " + error.message); 
    }); 
} 

Однако, похоже, что новое значение «последняя дата обновления» не копируется через после сохранения в ре-экспорте/импорте обратно в процесс MainEntityManager. Я работал над этим, но мне интересно, если я сделал что-то не так в этой реализации и есть ли лучший способ создать функцию сохранения одного объекта?

Комментарии и вопросы приветствуются!

ответ

0

Я еще не создал приложение Breeze с несколькими EntityManagers, но я прочитал документы по этому вопросу (похоже, что у вас тоже есть, но если у вас его нет: http://www.breezejs.com/documentation/multiple-managers).

Кстати, глядя на ваш код, я не думаю, что вы делаете то, что они описывают в документах. Возможно, это намеренно, но я подумал, что хочу указать на это. То, что они рекомендуют вам, это позволить пользователю делать локальные изменения против сущностей, разрешенных из вашего «песочницы» EntityManager, а затем каким-то образом (возможно, путем импорта, как вы это делаете) реплицируйте это изменение обратно в главный EntityManager.

Во всяком случае, я не думаю, что Бриз всегда отправляет копию объекта с сервера, когда вы его сохраняете.
Вот комментарий от EntityManager source:

// Обратите внимание, что операция visitAndMerge была оптимизирована таким образом, что мы на самом деле не выполнять слияние, если // операция сохранения фактически не возвращает объект - т.е. во время обновления и удаления OData и Mongo.

Чтобы подтвердить, является ли или нет сервер отправляет обратно копию объекта с сервера, запустите Fiddler (это неоценимый инструмент для всех веб-разработки), так что вы можете точно узнать, что возвращается в ответе. Fiddler даже красиво распечатает ответ JSON для вас, если вы попросите его. :-)

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