Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Фильтрация дерева (https://javascript.ru/forum/extjs/24960-filtraciya-dereva.html)

ICEMAN3141592 20.01.2012 11:13

Фильтрация дерева
 
Здравствуйте. Делаю фильтрацию дерева на ExtJs 3.4, но не получается что-то. Из примеров нашел только для ExtJs.Net

http://examples.ext.net/#/TreePanel/Advanced/Filter/

var triggerField = new Ext.form.TriggerField({
		fieldLabel: 'Поиск',
		triggerClass: 'x-form-search-trigger',
		enableKeyEvents: true
	});

// toolbar дерева, оно большое, поэтому только часть
tbar: {
			items: [
				{
					xtype: 'tbtext', 
					text: 'Поиск'
				},
				{
					xtype: 'tbspacer'
				},
				triggerField
			]	
		}

triggerField.on('keyUp',
					function(element, event) {
						var text = element.getRawValue();
						if (Ext.isEmpty(text, false)) {
							return;
						}
						
						if (event.getKey() === Ext.EventObject.ESC) {
							element.onTriggerClick();
						} else {
							var regExp = new RegExp(".*" + text + ".*", "i");
							var treeFilter = new Ext.tree.TreeFilter(tree);
							// Если название отдела
							if (isNaN(parseInt(text))) {
								
								treeFilter.filterBy(function (node) {
									return regExp.test(node.text);
								});
							} else {
								treeFilter.filterBy(function (node) {
									return regExp.test(node.id);
								});
							}
						}
					}, 
					triggerField, 
					{ buffer: 100 } 
	);
		
	triggerField.onTriggerClick = function(event) {
		this.setValue(""); 
		//tree.collapseAll();
		tree.getRootNode().expand();
		tree.expandAll();
	//	tree.getRootNode().ensureVisible();
	};


фильтрацию делаю по тексту узлов, так и по id.
Подскажите, пожалуйста :)

nekto_O 20.01.2012 11:43

а в чем проблема?

ICEMAN3141592 20.01.2012 12:01

Проблема в том, что хочется сделать как из примера по ссылке для Net-а, а не получается.
1. Ввожу символ, проверяет только корень. Я думаю, ну ладно, поставлю вместо filterBy -> filter
treeFilter.filter(regExp, 'text');
не помогло, все равно проверяет только корень.
2. При очистке триггера для ExtJs.Net-а есть
tree.getRootNode().collapseChildNodes(true);
tree.getRootNode().ensureVisible();
какая есть аналогия ?
Для tree.getRootNode().collapseChildNodes(true); вроде как подходит tree.collapseAll();
а для tree.getRootNode().ensureVisible(); что ?

Хочу сделать тоже самое поведение в конечном итоге

nekto_O 20.01.2012 12:31

1. Ноды сразу все загружаются или по экспанду родительской?
Цитата:

Сообщение от ICEMAN3141592
2. При очистке триггера для ExtJs.Net-а есть
tree.getRootNode().collapseChildNodes(true);
tree.getRootNode().ensureVisible();
какая есть аналогия ?

А это что по-вашему? -> http://docs.sencha.com/ext-js/3-4/#!...apseChildNodes
http://docs.sencha.com/ext-js/3-4/#!...-ensureVisible
Цитата:

Сообщение от ICEMAN3141592
Для tree.getRootNode().collapseChildNodes(true); вроде как подходит tree.collapseAll();

Это разные методы, collapseChildNodes() коллапсит только дочерние ноды, а collapseAll() вообще все ноды дерева.

ICEMAN3141592 20.01.2012 12:43

Цитата:

Сообщение от nekto_O
1. Ноды сразу все загружаются или по экспанду родительской?

Ах да, забыл, у меня сразу все загружаются, сделал статическое дерево, загружаю через Ajax.Request, потом передаю в children
var rootNode = new Ext.tree.AsyncTreeNode({
				text: 'Отделы',
				draggable: false,
				children: result.departments
			});
tree.setRootNode(rootNode);


Цитата:

Сообщение от nekto_O

У меня эта ссылка перестала работать в Mozilla Firefox, появляется экран ну и грузится бесконечно, решил сейчас проверить в Chrome, работает, порадовало. А документацией я пользуюсь http://newpg.ru/ExtJS/docs/ , хотя она немного устаревшая.

Цитата:

Сообщение от nekto_O
Это разные методы, collapseChildNodes() коллапсит только дочерние ноды, а collapseAll() вообще все ноды дерева.

Да из названия это понятно :) просто в старой документации по ExtJs3 нету, а вот 3.4 есть.

nekto_O 20.01.2012 12:52

юзайте свежую доку по ExtJS 3.4 http://docs.sencha.com/ext-js/3-4/

nekto_O 20.01.2012 12:56

Цитата:

Сообщение от ICEMAN3141592
загружаю через Ajax.Request, потом передаю в children

проще так:
tree.getLoader().load(node);

ICEMAN3141592 20.01.2012 12:58

Я ж говорю, в Mozilla Firefox 9.0.1 у меня все время так

ссылка на изображение, размер: 13.3 кбайт, 1024 x 706 точек

ICEMAN3141592 20.01.2012 13:14

Цитата:

Сообщение от nekto_O
tree.getLoader().load(node);

О, прикольно, попробую :)

У TriggerField есть autoWidth, почему оно может не работать в true ?

ICEMAN3141592 20.01.2012 15:51

var treeFilter = new Ext.tree.TreeFilter(tree);
	triggerField.on('keyUp',
					function(element, event) {
						var text = element.getRawValue();
						treeFilter.clear();
						
						if (event.getKey() === Ext.EventObject.ESC || Ext.isEmpty(text, false)) {
							element.onTriggerClick();
						} else {
							var regExp = new RegExp(".*" + text + ".*", "i");
							// Если название отдела
							if (isNaN(parseInt(text))) {	
								/*	treeFilter.filterBy(function (node) {
										return regExp.test(node.text);
									});
								*/
								treeFilter.filter(regExp, 'text'); 
							} else {
								treeFilter.filterBy(function (node) {
									return regExp.test(node.id);
								});
							}
						}
					}, 
					triggerField, 
					{ buffer: 100 } 
	);
		
	triggerField.onTriggerClick = function(event) {
		treeFilter.clear();
		this.setValue(""); 
		tree.getRootNode().collapseChildNodes(true);
		tree.getRootNode().ensureVisible();
	};


На tree.getRootNode().ensureVisible(); выскакивает ошибка
Ext.fly(child, "_scrollChildIntoView") is null
[Прерывать на этой ошибке] Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);
, что же не так делаю ?

Да и фильтрация осуществляется только по root-у :(


Часовой пояс GMT +3, время: 03:13.