Как получить идентификатор записи Dijit.Tree?

У меня есть элемент управления Dijit.Tree, написанный как код разметки. Теперь я использую обработчик событий onload, чтобы просмотреть элементы div.dijitTreeRow (через dojo.query) и добавить к ним img-теги.

Редактировать: Чтобы было ясно, я действительно хочу добавить img-теги к строке, так как я планирую использовать их в качестве кнопок действий (с событием onclick).

Однако в теге img мне нужен идентификатор элемента, который я передал в дерево ранее через json. Мне не нужен HTML-атрибут id!

Проверка метки в магазине невозможна, так как она может умереть при дублировании записей.

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

Итак, как мне вернуть удостоверение личности?


person Cobra_Fast    schedule 12.07.2011    source источник


Ответы (2)


Что ж, из div.dijitTreeRow вы можете получить доступ к div.dijitTreeNode, который соответствует виджету dijit._TreeNode, который, в свою очередь, будет иметь dijit.Tree.item, хранящийся в его свойстве item. Получив его, вы можете использовать методы TreeStoreModel для получения нужного идентификатора. Чтобы перейти от узла DOM (div.dijitTreeNode) к виджету Dijit (dijit._TreeNode), используйте dijit.byNode().

// Given rowNode is your div.dijitTreeRow...
var treeNode = dijit.byNode(rowNode.parentNode);
var item = treeNode.item;
var id = model.getIdentity(item);

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

Что вам действительно нужно, так это создать подкласс виджета dijit.Tree и предоставить свои собственные getIconClass/Style, getLabelClass/Style и/или getRowClass/Style и добавить свои изображения через CSS. Почему вы говорите, что переопределение методов не вариант?

Если вам нужно больше настроек, чем вы можете получить с помощью CSS (например, вы хотите добавить кнопки или действия к каждому узлу дерева), вы можете переопределить метод _createTreeNode для dijit.Tree и либо подкласс dijit._TreeNode, либо настроить его на месте. Опять же, имейте в виду, что подчеркивание в начале как метода, так и класса означает, что они закрыты и, следовательно, могут быть изменены в более поздних версиях Dojo.

Я бы посоветовал вам взглянуть на исходники Tree.js и этих отличные учебные пособия для указателей на то, как создать подкласс виджета _TreeNode.

person Gustavo Giráldez    schedule 12.07.2011
comment
Спасибо за ваш ответ! Я не пытаюсь изменить значок перед каждой записью. Я действительно пытаюсь добавить изображения, чтобы они могли функционировать как кнопки для действий (например, редактировать или удалять). Смогу ли я как-то добиться этого, переопределив? Также я не понимаю, как мне получить доступ к экземпляру dijit._TreeNode из div!? - person Cobra_Fast; 13.07.2011
comment
Я отредактировал свой ответ с некоторым кодом для доступа к id из файла div. Что касается того, что вы пытаетесь сделать, я бы переопределил метод _createTreeNode, поскольку вам нужно добавить логику к каждой строке, а не только к изображениям. - person Gustavo Giráldez; 13.07.2011
comment
Просто добавил несколько предложений по этому поводу. - person Gustavo Giráldez; 13.07.2011

Ответил j105rob на IRC-канале Dojo (престижность!).

Самый простой способ — перезаписать класс dijit.Tree и перезаписать _createNode в соответствии с потребностями. Однако подключение пользовательских событий к узлу, скорее всего, убьет функциональность DnD.

person Cobra_Fast    schedule 13.07.2011