Изменение существующего элемента

Вам часто придется использовать функцию setValue, приведенную в примере 9.8, для изменения значения атрибута элемента; ей передаются элемент, атрибут, который требуется изменить, и новое значение атрибута. Если элемент не имеет атрибута с указанным именем, он автоматически будет добавлен.
Пример 9.8. Запись значения атрибута элемента
//Извлечь элемент обычным способом...
var spanishCoffeeItem
coffeeStore.fetchItemByIdentity({
identity: "Spanish",
onItem : function(item, request) {
spanishCoffeeItem = item;
}
});
coffeeStore.setValue(spanishCoffeeItem, "foo", "bar");
coffeeStore.getValue(spanishCoffeeItem, "foo"); //bar
//Точно так же можно изменить любой другой атрибут, за исключением
//используемых для идентификации
coffeeStore.setValue(spanishCoffeeItem, "description",
"El Matador...?!?");

Следует отметить одну особенность: запись пустой строки в атрибут не то же самое, что удаление атрибута. Это особенно важно понять, если вы предполагаете использовать функцию hasAttribute из интерфейса Write для проверки наличия атрибута. Пример 9.9 иллюстрирует эту особенность.

Пример 9.9.


Установка значения атрибута и удаление
coffeeStore.hasAttribute(spanishCoffeeItem, "foo"); //true
coffeeStore.setValue(spanishCoffeeItem, "foo", ""); //foo=""
coffeeStore.hasAttribute(spanishCoffeeItem, "foo"); //true
coffeeStore.unsetAttribute(spanishCoffeeItem, "foo"); //удалит атрибут
coffeeStore.hasAttribute(spanishCoffeeItem, "foo"); //false

Приведенные ранее примеры этого раздела продемонстрировали, как можно изменять существующие элементы, но эти изменения нельзя считать окончательными, потому что явно не была выполнена операция сохранения. Внутри механизм ItemFileWriteStore отслеживает изменения и обслуживает коллекцию грязных элементов – элементов, которые были изменены, но еще не были сохранены. Например, после изменения элемента spanishCoffeeItem можно было бы с помощью функции isDirty выяснить, как показано в примере 9.10, что элемент изменился, но не был сохранен. Однако, после выполнения операции сохранения элемент перестает быть «грязным». Пока что под сохранением мы понимаем не что иное, как обновление копии в памяти, а об операции сохранения на сервере мы поговорим чуть позже.

Пример 9.10. Определить, был ли изменен элемент
/* Выполнить первое изменение spanishCoffeeItem...


*/
coffeeStore.isDirty(spanishCoffeeItem); //true
coffeeStore.save(); //обновит копию в памяти
coffeeStore.isDirty(spanishCoffeeItem); //false

Хотя прямо сейчас это и неочевидно, но преимущество такого требования явно вызывать операцию save для подтверждения изменений состоит в том, что оно обеспечивает возможность отмены изменений, если одна из последующих операций, выполняемых в рамках той же транзакции, приводит к появлению ошибки или возникают другие обстоятельства, которые требуют отмены изменений. В реляционных базах данных это часто называется откат (rollback). Пример 9.11 демон стрирует выполнение отмены изменений в хранилище данных dojo.data и подчеркивает очень тонкую, но очень важную особенность, связанную с локальными переменными, хранящими ссылки на элементы.

Пример 9.11. Отмена изменений механизмом ItemFileWriteStore
var spanishCoffeeItem
coffeeStore.fetchItemByIdentity({
identity: "Spanish",
onItem : function(item, request) {
spanishCoffeeItem = item;
}
});
coffeeStore.getValue(spanishCoffeeItem, "description"); //Very dark...
coffeeStore.setValue(spanishCoffeeItem, "description",
"El Matador...?!?");
//Сейчас как в spanishCoffeeItem, так и в хранилище находится
//измененное описание.


Попробуем извлечь этот же элемент еще раз,
//чтобы проверить это утверждение...
coffeeStore.fetchItemByIdentity({
identity: "Spanish",
onItem : function(item, request) {
coffeeStore.getValue(item, "description"); //El Matador...?!?
coffeeStore.isDirty(item); //true
)};
coffeeStore.revert(); //отменить изменения.
// В результате выполнения revert() локальная переменная
// spanishCoffeeItem перестала быть элементом данных
coffeeStore.isItem(spanishCoffeeItem); //false
//Извлечь элемент еще раз, чтобы продемонстрировать его
//содержимое...
coffeeStore.fetchItemByIdentity({
identity: "Spanish",
onItem : function(item, request) {
coffeeStore.isDirty(item); //false
coffeeStore.getValue(item, "description"); //Very dark...
}
});

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
ItemFileReadStore
ItemFileWriteStore
Анализ ItemFileReadStore
Запрос дочерних элементов
Иерархии и ссылки в формате JSON

Вернуться в раздел: Dojo / Абстракция данных