Сохранение двух коллекций

Добрый день, Подскажите пожалуйста, как можно реализовать такую задачу:
есть два datatable у которых dataprocessor установлен в autoupdate = false. После редактирования этих таблиц пользователь сохраняет данные. Как вызвать обработчик тогда, когда данные сохраняться в обоих datatable?

Добрый день, можно ли больше деталей по вашему кейсу?

  • Эти 2 таблицы синхронизированы (.sync) друг с другом?
  • Каким образом данные сохраняются?
  • Нужно именно событие, которое отработает, когда ответ придет сервера?

Есть редактор записи, по типу master-detail. Данные master редактируються в ui.property, а details редактируются в нескольких ui.datatable. Когда пользователь отредактировал запись и жмёт на кнопку сохранить, то происходит сохранение каждой части данных через свой rest контроллер.

save:function(){
webix.ajax().post(‘propertyController’,{data:property.getValues()});
webix.dp(datatable1).send();
webix.dp(datatable2).send();
}

webix.ajax возвращает promise, поэтому проблем не составит отловить момент сохранения, а вот что делать с DataProcessor. Как вызвать обработчик, когда все данные сохраняться?
Можно конечно собирать все данные в nested data и сохранять через один контроллер, но их не очень удобно обрабатывать на сервере.

У DataProcessor есть свои события: https://docs.webix.com/api__refs__dataprocessor_events.html

Для вашего случая наиболее подходящим будет onAfterSync, которое вызывается, когда получен и обработан ответ от сервера:https://webix.com/snippet/d6ab6ac6

Спасибо. Но в таком случае onAfterSync будет вызвано для каждой изменённой записи,т.е 2 записи удалили 2 записи добавили, будет вызвано onAfterSync 4 раза, а вот как определить тот момент, когда все операции синхронизации окончились?

Data Processor устроен так, что он обрабатывает каждую измененную запись отдельно, посылает запрос на её сохранение и разбирает ответ сервера. Поэтому onAfterSync и другие события вызываются для каждой записи последовательно.

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

webix.proxy.all = {
  $proxy:true,
  //send all changed records to server
  saveAll:function(view, updates, dp, callback){
    webix.ajax().post(this.source, {data:updates}, callback);
  },
  //process common response on client
  result:function(state, view, dp, text, data, loader){
    data = data.json();

    for(var i = 0; i<data.length; i++){
        dp.processResult(data[i], data[i], {text:text, data:data, loader:loader})
    }
  }
};

https://webix.com/snippet/481b9b6f (url там не сохраняет такие данные, поэтому ответ сервера эмулируется)

И тогда onAfterSync DataProcessor-a сработает один раз на каждую попытку сохранить измененные данные.

Спасибо, Helga.

@Helga
Помоему вариант с saveAll работает не правильно.
Если от сервера получен статус >= 400, получаем ошибку.
Виной всему :
url.saveAll(this.config.master, to_send, this, this._send_callback({}));
Мы не передаем в колбэк нужный/е ID, в то время как для save используется следующая конструкция: this._send_callback({ id:tosave.id, status:tosave.operation });
(webix UI v.5.4.0 GPL > l.34970)

https://snippet.webix.com/fypwd2g5

P.S. Проблема не относится к этому посту, а является общей.