Есть ли способ показать только родительские узлы в дереве extjs - PullRequest
0 голосов
/ 08 марта 2012

Я хочу показать только родительские узлы дерева в extjs. В моем хранилище данных также есть листовые узлы.

Вывод должен быть как -

Folder 1
   Folder 1.1
Folder 2
Folder 3

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Создайте объект фильтра, который получает только родительские узлы, и добавьте его в конфигурацию магазина:

например. фильтр только для родительских узлов:

var nodeFilter = new Ext.util.Filter({
    property: 'leaf',
    value   : false
});

Поместить его в конфигурацию treetore:

var yourTreeStore = Ext.create('Ext.data.TreeStore', {
    // other configs ...
    filters: [nodeFilter]
});

EDIT:

incutonez прав, я отправил в соответствии со свойствами API, но не заметил отсутствующие функции. Их достаточно легко переопределить, хотя и применить фильтрацию к дереву. Это работает для меня в 4.1b2:

Ext.override(Ext.data.TreeStore, {

    hasFilter: false,

    filter: function(filters, value) {

        if (Ext.isString(filters)) {
            filters = {
                property: filters,
                value: value
            };
        }

        var me = this,
            decoded = me.decodeFilters(filters),
            i = 0,
            length = decoded.length;

        for (; i < length; i++) {
            me.filters.replace(decoded[i]);
        }

        Ext.Array.each(me.filters.items, function(filter) {
            Ext.Object.each(me.tree.nodeHash, function(key, node) {
                if (filter.filterFn) {
                    if (!filter.filterFn(node)) node.remove();
                } else {
                    if (node.data[filter.property] != filter.value) node.remove();
                }
            });
        });
        me.hasFilter = true;

    },

    clearFilter: function() {
        var me = this;
        me.filters.clear();
        me.hasFilter = false;
        me.load();
    },

    isFiltered: function() {
        return this.hasFilter;
    }

});

С помощью этого переопределения в вашем коде вы можете создать фильтр «только для листа» как функцию или пару свойство / значение в соответствии с Ext.util.Filter API:

// leaf only filter as a property/value pair
var nodeFilter = new Ext.util.Filter({
    property: 'leaf',
    value   : false
});

// leaf only filter as a function
var nodeFilter = Ext.create('Ext.util.Filter', {
  filterFn: function(item) {
    return !item.data.leaf;
  }
});

Вы можете просто вызывать функцию фильтра всякий раз, когда вынимаете конечные узлы:

myTreeStore.filter(nodeFilter);
0 голосов
/ 09 марта 2012

TreeStores не наследуют фильтрацию (потому что они являются абстрактными хранилищами), поэтому ответ Geronimo не сработал для меня. Я бы хотел, чтобы это произошло, потому что это сделало бы мою жизнь намного проще.

В любом случае, у меня есть ветка на форумах Sencha, которая предоставляет работающее решение для фильтрации. В моем примере фильтрация вызывается функцией filterBy, поэтому я уверен, что вы можете настроить ее так, чтобы она работала по-вашему.

...