2012-03-22 1 views
1

Возможно ли получить узел по его внутреннему идентификатору? Я пробовал:Ext JS 4: Получить узел TreeStore по внутреннему ядру

магазин

Ext.define('myStore', { 
    extend: 'Ext.data.TreeStore', 
    storeId: 'treestore', 
    root: { 
    text: 'root', 
    children: [{ 
     text: 'leaf1', 
     id: 'leaf1', 
     children: [{ 
     text: 'child1', 
     id: 'child1', 
     leaf: true 
     },{ 
     text: 'child2', 
     id: 'child2', 
     leaf: true 
     }] 
    },{ 
     text: 'leaf2', 
     id: 'leaf2', 
     leaf: true 
    },{ 
     text: 'leaf3', 
     id: 'leaf3', 
     leaf: true 
    }] 
    }, 
    proxy: { 
    type: 'memory', 
    reader: { 
     type: 'json' 
    } 
    } 
}); 

Дерево

Ext.create('Ext.tree.Panel', { 
    id: 'myTree', 
    rootVisible: false, 
    store: Ext.create('myStore'), 
    width: 300, 
    height: 500, 
    renderTo: Ext.getBody() 
}); 

Добавление и получение узла

Ext.getCmp('myTree').getRootNode().appendChild({id: 'test', text: 'test', leaf: true}); // this test node takes on the internalId 'ext-record-2' 
Ext.getCmp('myTree').store.getNodeById('ext-record-2'); // returns undefined 
Ext.getCmp('myTree').getRootNode().findChild('id', 'ext-record-2', true); // returns null 
Ext.getCmp('myTree').getRootNode().findChild('internalId', 'ext-record-2', true); // I was just trying things at this point. 

Я понимаю, что т его, вероятно, невозможно, поэтому я объясню, что я пытаюсь сделать ... Я пытаюсь изменить идентификатор узла, поэтому, когда я использую getNodeById, я могу использовать новый идентификатор, который я сделал. Идея заключается в том, что если я изменил идентификатор, я смог бы найти его в дереве, и он будет уникальным, потому что я допускаю только добавление уникальных идентификаторов ... но идентификатор не изменится. Затем я подумал, что использование идентификатора «ext-record» будет удостоверяться, что я верну уникальный идентификатор, но тогда я не мог понять это, ха-ха.

Вот код, показывающий, что я хотел бы сделать.

var node = Ext.getCmp('myTree').store.getNodeById('test'); // returns my test node 
node.beginEdit(); 
node.set('id', 'blah'); 
node.endEdit(); 
node.commit(false); 
alert(Ext.getCmp('myTree').store.getNodeById('blah')); // returns undefined 
alert(Ext.getCmp('myTree').store.getNodeById('test')); // still returns my test node 

Я попытался использовать метод синхронизации дерева, но ничего не сделал. Мне просто интересно, как я могу обновить идентификатор узла, поэтому, когда я использую getNodeById, я могу использовать новый идентификатор. Есть предположения?

+0

Пожалуйста, разместите код, как вы создаете свой магазин деревьев – sha

+0

Это поможет? – incutonez

ответ

0

пару вещей:

  1. Попробуйте отладить его шаг за шагом. То есть отлаживаем то, что вы получаете после Ext.getCmp(). store и Ext.getCmp(). getTreeRoot(). Проверьте, есть ли у узла какие-либо дочерние элементы в массиве.

  2. Что такое beginEdit/endEdit? У NodeInterface эти методы отсутствуют.

  3. Почему вы пытаетесь изменить Id? Мне просто интересно - это очень необычная задача для моего вкуса.

+0

1. Я отлаживал его, и все было кошерно. – incutonez

+0

2. [beginEdit] (http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.Model-method-beginEdit), [endEdit] (http: // docs .sencha.com/ext-js/4-0/#!/api/Ext.data.Model-method-endEdit) и [commit] (http://docs.sencha.com/ext-js/4- 0/#!/Api/Ext.data.Model-method-commit) являются частью модели, которой наследуется NodeInterface. Они должны гарантировать, что никакой другой процесс не будет обновлять магазин. – incutonez

+0

3. Я хотел бы дать пользователю возможность изменить текст узла, и когда они меняют текст узла, я хочу, чтобы идентификатор менялся вместе с ним. – incutonez

1

Попробуйте

var node = Ext.getCmp('myTree').queryById('ext-record-2'); 
+0

причина, по которой это было приостановлено? – goodies4uall