У меня есть dijit.Tree
, подкрепленный ForestStoreModel
, который использует пользовательское хранилище данных для предоставления данных.Это хорошо работает, но я хочу предоставить пользователю возможность переставлять элементы верхнего уровня (и только верхнего уровня) с помощью средства перетаскивания dojo.
Проблема в том, чтоФункция ForestStoreModel::pasteItem
проверяет, является ли элемент дочерним элементом корня, а затем передает null
в TreeStoreModel::pasteItem
.
pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
// summary:
// Move or copy an item from one parent item to another.
// Used in drag & drop
if(oldParentItem === this.root){
if(!bCopy){
// It's onLeaveRoot()'s responsibility to modify the item so it no longer matches
// this.query... thus triggering an onChildrenChange() event to notify the Tree
// that this element is no longer a child of the root node
this.onLeaveRoot(childItem);
}
}
dijit.tree.TreeStoreModel.prototype.pasteItem.call(this, childItem,
oldParentItem === this.root ? null : oldParentItem,
newParentItem === this.root ? null : newParentItem,
bCopy,
insertIndex
);
if(newParentItem === this.root){
// It's onAddToRoot()'s responsibility to modify the item so it matches
// this.query... thus triggering an onChildrenChange() event to notify the Tree
// that this element is now a child of the root node
this.onAddToRoot(childItem);
}
}
. TreeStoreModel
не обновляет базовое хранилище данных, еслипереданные родительские элементы имеют значение null, а события onLeaveRoot
и onAddToRoot
не передаются в insertIndex
, поэтому я не могу использовать их для обновления моего хранилища данных (в любом случае кажется, что это будет немного назад).
На данный момент я думаю, что единственно приемлемым вариантом является расширение ForestStoreModel
, чтобы позволить мне установить синтетический элемент $root$
на совместимый объект хранилища данных и позволить ForestStoreModel
передать его без изменений., вплоть до TreeStoreModel
.
Есть ли другой способ решения этой проблемы?
Обновление
Возможное решение оказалось четнымпроще, чем предполагалось.Мой ForestStoreModel
уже является пользовательским классом, потому что я на самом деле использую ObjectStore dojo 1.6 в качестве источника данных, поэтому я могу передать нужный индекс в аргументе options
в метод store store put
.Исправление было простым, поскольку я позволил родительскому классу позаботиться о вызовах onLeaveRoot
и onAddRoot
:
pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
// Handle drag & drop at the root level
if (oldParentItem === this.root && newParentItem === this.root){
this.store.put(childItem, { index: insertIndex });
}
this.inherited(arguments);
}