2010-10-28 7 views
2

Я обрабатываю дерево, используя массив Jason, который я получаю со страницы jsp. Таким образом, дерево имеет корневой узел и 3 узла, и каждый узел имеет более 5 детей, а некоторые из них имеют одинаковый идентификатор и один и тот же текст. Он отображается правильно и никаких проблем не отображается.ExtJS Tree same parentNode

Я пытаюсь заставить пользователя выбирать дочерние узлы только одного типа (одного из трех узлов). если пользователь выбирает любой узел, который не является дочерним узлом уже существующего узла, тогда мне нужно просто проверить уже проверенные узлы. Это звучит довольно просто, и я его закодировал. Я в основном сравнивал родительские узлы (node.parentNode.id) проверяемого узла с уже проверенными узлами (tree.getCheckedNodes())

проблема заключается в том, что я выбираю дочерние узлы, которые имеют одинаковые идентификаторы и текст. и они говорят, что у них одинаковый parentNode.id, хотя у них есть другой parentNode.id. Проверяет ли панель дерева на наличие повторяющихся элементов и назначает их одному и тому же родительскому контуру при загрузке? что здесь происходит и как это исправить. Спасибо.

Ext.onReady(function(){ 
    var tree = new Ext.tree.TreePanel({ 
    id: 'deficiencyTree', 
    renderTo: 'MyTable', 
    title: 'Deficiencies', 
    height: 'auto', 
    width: 525, 
    useArrows: true, 
    autoScroll: true, 
    animate: true, 
    enableDD: true, 
    containerScroll: true, 
    rootVisible: false, 
    frame: false, 
    root:{nodeType: 'async'}, 
    dataUrl: 'jsonFile.jsp', 
    listeners: {  
     'checkchange': function (node, checked) { 

     if (checked) { 
      selNodes = tree.getChecked(); 
      alert(selNodes);  
      Ext.each(selNodes, function (nodes) { 

    alert("id values for node and nodes "+node.parentNode.id+" "+nodes.parentNode.id); 

      if (nodes.parentNode.id != node.parentNode.id) 
      { 
      nodes.getUI().toggleCheck();    
      }  

      }); 
     }  
     list.length = 0; 
     iii = 0; 
     selNodess = tree.getChecked(); 
     Ext.each(selNodess, function (nodes) { 
      list[iii] = nodes.id; 
      iii++; 
     }); 
     } 
    } 
    }); 
    tree.getRootNode().expand(false); 
}); 

ответ

1

В качестве полуоткрытия в идеале вы не должны дублировать идентификаторы узлов вообще (идентификатор никогда не должен реплицироваться, в противном случае он не является идентификатором). Если вам нужно значение, которое вы в настоящее время назначаете в поле ID, добавьте дополнительный атрибут к узлу и поместите его здесь - вы можете обратиться к этому атрибуту, когда вам нужно. ExtJS не предназначен для обработки повторяющихся идентификаторов для заметок внутри одного и того же дерева.

+0

Да, мне нужен этот идентификатор позже, чтобы сохранить мои выборки в базе данных. поэтому я попытался поместить новый атрибут с именем ID2, по идентификатору и тексту для каждого узла, но когда я попытался получить к нему доступ (node.ID2, например node.id, node.text), он говорит undefined. любая идея, как получить доступ к новому атрибуту? Благодарю. –

0

Я использовал hierarhical идентификаторами, чтобы решить эту проблему: так, если путь к элементу был x ->y ->z то его идентификатор в дереве будет x+y+z

вам просто нужно изменить на стороне сервера код: - Получить идентификатор в формате x+y+z, найти последнюю + и получить z - возвращает элементы с идентификаторами [x+y+z+childId]

+0

Это звучит как хорошая логика, но я назначаю идентификаторы из таблицы базы данных (первичное значение ключа) и не могу изменить это. Пожалуйста, поправьте меня, если я понял ваше предложение иначе. thanks –

+0

Вы используете измененный идентификатор только в переписке между страницей и сервером. Сервер может сохранять идентификаторы любым способом. Вам просто нужно создать код, который преобразует идентификатор сервера в «+» идентификаторы и назад. –

+0

Вот мой код java: ... String nodeId = request.getParameter ("node"); String docId = null; int pin = nodeId.lastIndexOf ("+"); if (pin> 0) { docId = nodeId.substring (pin + 1, pin + 33); } else { docId = nodeId; } ... ... JSONArray json = new JSONArray(); for (String key: result.keySet()) { JSONObject entity = new JSONObject(); объект entity.put ("текст", result.get (ключ)); entity.put ("id", nodeId + "+" + ключ); entity.put ("cls", "folder"); json.put (entity); } out = json.нанизывать(); ... –

0

Хорошие новости. Я заработал. это было довольно просто. Как предположил «Xupypr MV», я не должен использовать тот же ID, который противоречит основным функциям, поэтому я поместил другой идентификатор для каждого узла и поместил новый атрибут с именем id2 и присвоил ему значение, которое мне нужно, а затем обратился к нему используя node.attribute ["id2"], и он работает отлично. ранее я пытался получить значение атрибута как node.id2 так же, как node.id, node.text, который не работал. Еще раз спасибо за ответы.

Смежные вопросы