Добрый день, Подскажите пожалуйста, как можно реализовать такую задачу:
есть два 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. Проблема не относится к этому посту, а является общей.