如何在 extjs 4 (mvc) 中过滤静态 treeStore

Posted

技术标签:

【中文标题】如何在 extjs 4 (mvc) 中过滤静态 treeStore【英文标题】:how to filter static treeStore in extjs 4 (mvc) 【发布时间】:2012-12-20 05:31:37 【问题描述】:

我有一个静态树存储,我想过滤我的树。为此,我添加了一个 tbar。如何从这个 tbar 的文本字段中过滤我的树?

这是我的静态数据商店

Ext.define('TestApplication.store.TreeStoree', 
    extend: 'Ext.data.TreeStore',
    root: 
        expanded: false, 
        children: [
            text: "Project",
            expanded: false,
            children:[
                 id: '1', text: "Transaction", leaf: true ,
                 id: '2', text: "Query", leaf: true ,
                 id: '3', text: "Report", leaf: true ,
                 id: '4', text: "Initialization", leaf: true ,
                 id: '5', text: "Sequence", leaf: true ,
                 id: '6', text: "Batch", leaf: true 
            ]
        , 
            text: "Records Display",
            expanded: false, 
            children: [
                 id: '7', text: "Previous", leaf: true ,
                 id: '8', text: "Running", leaf: true 
            ]
        , 
            text: "Photo",
            expanded: false, 
            children: [
                 id: '9', text: "Specimen", leaf: true 
            ]
        , 
            text: "Signature",
            expanded: false, 
            children: [
                 id: '10', text: "Carbon Copy", leaf: true 
            ]
        , 
            text: "D N A",
            expanded: false, 
            children: [
                 id: '11', text: "Plastrain", leaf: true ,
                 id: '12', text: "Generic", leaf: true 
            ]
        ]
    
);

在本节中,我添加了一个带有文本字段的 tbar 并希望从中进行搜索

Ext.define('TestApplication.view.display.TreeView' ,
    extend: 'Ext.tree.Panel',
    alias : 'widget.treeView',
    rootVisible: false,
    useArrows: true,
    border:true,
    initComponent: function() 
        var me = this;
        me.tbar = [
        
            xtype: 'treefilter', 
            emptyText: 'Search', 
            store: 'TreeStoree', 
            flex: 1 
        
        ];
        me.callParent(arguments);
    
);

我的自定义树过滤器

Ext.define('TestApplication.view.display.CustomFilter', 
    extend: 'Ext.form.field.Trigger',
    alias: 'widget.customfilter',
    trigger1Cls: Ext.baseCSSPrefix + 'form-clear-trigger',
    trigger2Cls: Ext.baseCSSPrefix + 'form-search-trigger',

    initComponent: function() 
        var me = this;    
        me.callParent(arguments);
        me.on('change', function()
            me.onFilterStore();
        );      

    ,
    onFilterStore : function()
                // what will be my codes here..........???????????????????
        
);

【问题讨论】:

【参考方案1】:

一方面,TreeStore 没有过滤器操作,您可以在 the documentation 中看到。

在任何情况下,triggers 的正确用法是定义单击每个触发器时要执行的操作。对于每个triggerXCls,定义一个对应的onTriggerXClick 来处理要做什么。看小小提琴here。

Ext.define('TestApplication.view.display.CustomFilter', 
    extend: 'Ext.form.field.Trigger',
    alias: 'widget.customfilter',
    trigger1Cls: Ext.baseCSSPrefix + 'form-clear-trigger',
    trigger2Cls: Ext.baseCSSPrefix + 'form-search-trigger',

    initComponent: function() 
        var me = this;
        me.callParent(arguments);
        me.on(
            change: me.onFilterStore,
            scope: me,
         );

    ,
    onTriggerClick: function() 
        var me = this;
        console.log('You clicked my clear trigger!');
        me.setValue('');
    ,
    onTrigger2Click: function() 
         var me = this;
         console.log('You clicked my search trigger!');
    ,
    onFilterStore: function()
        console.log('change is-a happening');
    

);

我能想到的最好的办法是在启动搜索时,通过树的根节点级联并填充一个全新的根节点对象,其中包含与搜索文本匹配的节点。然后在treePanel 的存储上设置RootNode。清除搜索需要恢复原来的根节点。

更好的是,我会通过根节点级联并更改与搜索不匹配的项目类别,使它们显示为灰色。这将使与搜索“pop”匹配的节点。

编辑:更好的是,这里有 answers 与树过滤有关。试一试这些解决方案。

【讨论】:

以上是关于如何在 extjs 4 (mvc) 中过滤静态 treeStore的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个组 ExtJS 4 中过滤分组网格

ExtJs 4 MVC 应用架构:如何引用子文件夹中的文件

在 ExtJS 4 MVC 中查看单元

将函数中配置的 html 添加到 ExtJS 4 MVC

如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc

在 html div 中渲染 ExtJS 4+ MVC 应用程序 - 操作方法?