Создание и удаление элементов

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

Пример 9.12. Добавление и удаление элемента средствами механизма
ItemFileWriteStore
var newItem = coffeeStore.newItem({
name : "Really Dark",
description : "Left brewing in the pot all day...extra octane."
});
coffeeStore.isItem(newItem); //true
coffeeStore.isDirty(newItem); //true
/* Запросить элемент, сохранить изменения, отменить изменения, и т. д. */
//Или удалить элемент...
coffeeStore.deleteItem(newItem);
coffeeStore.isItem(newItem); //false

Несмотря на то что добавление и удаление элементов верхнего уровня выглядит достаточно тривиально, тем не менее для добавления нового элемента приходится приложить чуть больше усилий, если элемент является дочерним и необходимо добавить ссылку на него гдето в другом месте.


Пример 9.13. демонстрирует, как это выполняется. Суть состоит в том, что необходимо сначала создать элемент верхнего уровня, затем получить ссылку на коллекцию дочерних элементов, к которой следует присоединить данный элемент и, наконец, добавить его в эту коллекцию.

Пример 9.13. Добавление дочернего элемента в набор данных, имеющий формат JSON со ссылками
// Создать новый элемент
var newItem = coffeeStore.newItem({
name : "Really Dark",
description : "Left brewing in the pot all day...extra octane."
});
var darkRoasts;
//Получить ссылку на родительский элемент с дочерними элементами
coffeeStore.fetchItemByIdentity({
identity : "Dark Roasts",
onItem : function(item, request) {
darkRoasts = item;
}
});
//С помощью getValues получить ссылку на коллекцию дочерних элементов
var darkRoastChildren = coffeeStore.getValues(darkRoasts, "children");
//И добавить новый элемент в эту коллекцию с помощью setValues
coffeeStore.setValues(darkRoasts, "children",
darkRoastChildren.concat(newItem)
);
//Теперь можно выполнить обход дочерних элементов
//чтобы убедиться в том, что новый элемент был добавлен в коллекцию...
dojo.forEach(darkRoastChildren, function(x) {
console.log(coffeeStore.getValue(x, "name"));
});

Удаление выполняется именно так, как и следовало ожидать.


Удаление элемента верхнего уровня приводит к удалению самого элемента из набора данных, но оставляет его дочерние элементы нетронутыми.

Пример 9.14. Удаление элемента верхнего уровня средствами механизма ItemFileWriteStore
var darkRoasts;
coffeeStore.fetchItemByIdentity({
identity : "Dark Roasts",
onItem : function(item, request) {
darkRoasts = item;
}
});

coffeeStore.deleteItem(darkRoasts);
coffeeStore.fetch({
query : {name : "*"},
onItem : function(item, request) {
//Вы не увидите элемент "Dark Roasts" в этих результатах...
console.log(coffeeStore.getValue(item, "name"));
},
onComplete : function(items, request) {
/* Выполнить операцию сохранения, или отмены, или... */
}
});

Очевидно, что можно было бы сначала получить коллекцию всех дочерних элементов, удалить их, а затем удалить сам элемент верхнего уровня.

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

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

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