Вы уже наверняка подумали, что сохранение изменений в памяти – это, конечно, замечательно, но как быть, если необходимо вернуть данные серверу? Оказывается, механизм ItemFileWriteStore предоставляет точку подключения расширения _saveCustom, которую можно использовать для вызова собственной процедуры всякий раз, когда вызывается метод save, то есть, помимо сохранения изменений в локальной копии и сброса признака «грязный» (dirty) у всех измененных элементов, можно также выполнять синхронизацию с сервером или выполнять еще чтонибудь. В вашем распоряжении остаются все те же функции интерфейса, которые вы использовали все время, но вообще, операция «полного сохранения», вероятно, могла бы включать в себя обход всего набора данных, сериализацию данных в некоторый формат – скорее всего, с помощью функции dojo.toJson – и передачу их на сервер. Согласно определению интерфейса Write, имеется возможность указать в именованных аргументах необязательные функции обратно го вызова onComplete и onError, которые будут вызываться в случае успеха или ошибки. Cуществует дополнительная возможность определить аргумент scope, задающий контекст выполнения для всех этих функций обратного вызова. Однако, эти аргументы передаются функции save, но они не передаются расширению _saveCustom.
В примере 9.15 демонстрируется, как можно реализовать обработчик _saveCustom, выполняющий передачу данных на сервер при вызове функции save(). Как видно из примера, все достаточно предсказуемо.
Пример 9.15. Собственный обработчик операции сохранения для механизма
ItemFileWriteStore
<html>
<head>
<title>Fun with ItemFileWriteStore!</title>
<script
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js">
</script>
<script type="text/javascript">
dojo.require("dojo.data.ItemFileWriteStore");
dojo.addOnLoad(function( ) {
coffeeStore = new dojo.data.ItemFileWriteStore(
{url:"coffee.json"});
coffeeStore._saveCustom = function( ) {
/* Здесь выполняются действия, необходимые для
передачи данных на сервер. Это расширение вызывается
всякий раз, когда происходит обращение к функции
save(). */
}
});
</script>
</head>
(body)
(/body)
</html>
Оказывается, точка расширения _saveCustom используется не так часто, как можно было бы подумать, так как ее использование связано с передачей на сервер всего набора данных, что обычно не является необходимым, если работа не начинается с пустого набора данных, и нет нкужды выполнять начальную отправку всех данных. Чаще всего, особенно в случае очень больших наборов данных, предпочтительнее использовать интерфейс Notification, который будет представлен в следующем разделе, для передачи изменений небольшими порциями.