<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>Деревья в ExtJS. навигация, удаление, вставка узлов, Drag &amp; Drop</title>
    <meta name="css" content="/doc/ext/ext_examples.css"/>
    <meta name="js" content="/js/EXT4/ext-all.js;/doc/ext/820.js"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="61"/>
    <link rel="stylesheet" type="text/css" href="/doc/ext/ext_examples.css"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / 10.2 Деревья в ExtJS. Манипуляции с узлами</h1>
          <ol class="tags big">
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <div class="myContent"><h2>
   1. Drag &amp; Drop
</h2>
<p>
  В ExtJS предусмотрена сортировка узлов дерева через
  Drag&amp;Drop. Lkz njuj xnj, Делается это добавлением всего одной
  строчки в конфигурацю
</p>
<pre class="brush: js">
    var tree=Ext.create('Ext.tree.Panel', {
        …………………………….
            viewConfig: {plugins: {ptype: 'treeviewdragdrop'}},         
        …………………………….
    });

</pre>
<p>
  Теперь в полученном дереве (см. ниже) можно мышкой тасовать
  туды-сюды узлы дерева.
</p>
<div id="ex1"/>
<h2>
   2. Навигация по дереву
</h2>
<p>
  Получить необходимый узел дерева можно несколькими способами.
  Пока я остановился на одном. Для начала я получаю корень дерева:
</p>
<pre class="brush: js">
var root = tree.getRootNode();          // здесь получаю его корневой узел.
</pre>
<p>
  Метод getRootNode отдает объект типа <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface">
   Ext.data.NodeInterface</u> в котором предусмотрены методы и
  свойства работы с каждым узлом отдельно. В частности следующие
  свойства:
</p>
<ul>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-nextSibling">
    nextSibling</u> - следующий сосед
  </li>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-previousSibling">
    previousSibling</u> предыдущий сосед
  </li>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-parentNode">
    parentNode</u> - родитель
  </li>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-lastChild">
    lastChild</u> псоледний дочерний узел
  </li>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-firstChild">
    firstChild</u> - первый дочерний узел
  </li>
  <li>
    <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface-property-childNodes">
    childNodes</u> - массив дочерних узлов
  </li>
</ul>
<p>
  Дополнительно к указанным свойствам есть метод позволяющий
  перебрать в цикле все дочерние узлы:
</p>
<pre class="brush: js">
root.eachChild(function(childnode) {…. сделать что-то с узлом …});
</pre>
<p>
  В документации я не нашел метода, позволяющего вытащить
  информацию о текущем узле. Как вытащить свойства узла (те которые
  использовались при создании узлов дерева) в документации я не
  нашел. Методом тыка в FireBug выяснилось, что у <u class="external" title="docs.sencha.com/ext-js/4-0/#%21/api/Ext.data.NodeInterface">
   Ext.data.NodeInterface</u> есть свойство <em>data</em> которое
  можно и читать и изменять. В отдельных примерах так оно и
  делается. Х.з. насколько это правильно, но пока других вариантов
  я не обнаружил.
</p>
<p>
  Ниже я сделал два контейнера, один для вывода дерева, второй для
  проверки работы указанных методов и вывода отадочной информации
</p>
<div id="ex2"/>
<div id="ex21" class="domexample"/>
<p>
  Ниже код примера с комментариями
</p>
<pre class="brush: js">
var tree=Ext.create('Ext.tree.Panel', {…});      
var root = tree.getRootNode();  // здесь получаю его корневой узел.
var first=root.firstChild;              // получаю первый дочерний узел.
var next =first.nextSibling     // получаю следующего соседа первого дочернего узла.
var childs=root.childNodes;             // получаю массив всех дочерних узлов.
var last=root.lastChild;                // получаю последний дочерний узел.
var s= // отладочная информация
     'FirstChild:'+first.data.text+'; '+         
     'Next:'+next.data.text+'; '+        
         'LastChild:'+last.data.text+';<br/> ' +  
         'childNodes:'+childs+'; ';                      
s+=«<br/>eachChild:»      
root.eachChild(function(childnode) {
s=s+childnode.data.text+'; ';
}); Ext.get('ex21').update(s);
</pre>
<h2>
   2. Добавление, удаление узлов
</h2>
<p>
  Применительно к классу Ext.data.NodeInterface есть набор методов
  для удаления-добавления узлов:<br/>
  appendChild, InsertChild,insertBefore,insertAfter<br/>
  В примере выше я определил корень дерева, к этому корню добавлю
  дочерний узел:
</p>
<pre class="brush: js">
var parent = root.appendChild(
      {text: 'root.appendChild'}
     );
</pre>
<p>
  Результат <em>appendChild</em> возвращает ссылку на добавленный
  узел. Добавлять можно не т олько отдельные узлы, но и целые
  деревья:
</p>
<pre class="brush: js">
parent.appendChild(
    [
           {text: 'parent.appendChild 1',leaf: true},
           {text: 'parent.appendChild 2',leaf: true},
           {text: 'parent.appendChild 3',leaf: true}
        ]);
parent.expand(); // здесь я раскрыл узел 
</pre>
<p>
  метод InsertChild используется для вставки узла перед узлом с
  известным индексом (индекс по порядку следования в наборе
  дочерних узлов 0,1,2…) 
</p>
<pre class="brush: js">
root.insertChild( // вставка перед третьим узлом 
    2, {text: 'root.insertChild 2',leaf: true});
root.insertChild(// вставка перед первым узлом
        0, {text: 'root.insertChild 0',leaf: true});
</pre>
<p>
  для метода insertBefore и insertAfter требуется указать узел
  после и перед которым нужно сделать вставку нового узла:
</p>
<pre class="brush: js">
   
parent.insertBefore(
  {text: 'insertBefore',leaf: true}, 
   parent.firstChild);
</pre>
<p>
  результат выполнения этих методов, применительно к дереву из
  предыдущего примера можно видеть ниже
</p>
<div id="ex3"/>
<p>
  C удалением ничего нового:
</p>
<pre class="brush: js">
  node.remove();

</pre>
<h2>
  Далее
</h2>
<ol>
  <li>
    <a href="/62.htm">Навигация по DOM. Часть 1</a>
  </li>
  <li>
    <a href="/63.htm">Навигация по DOM. Часть 2</a>
  </li>
  <li>
    <a href="/64.htm">Манипуляции с DOM. Часть 1. Установка/чтение
    стилей, классов, атрибутов</a>
  </li>
  <li>
    <a href="/65.htm">Манипуляции с DOM. Часть 2.
    Добавление/удаление и пр. операции с узлами</a>
  </li>
</ol></div>
          <ol class="tags big">
            <li class="date">2011-12-11</li>
            <li>
              <a href="/ExtJS-4">ExtJS-4</a>
            </li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>www.sencha.com/learn/ext-js-trees/</span> - <b>www.sencha.com: The Tree Component. Ext JS, 4.x. Guide</b></a>
            </li>
          </ol>
          <ul class="comment"/>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

