Ext version tested:
Ext 4.1.4.605


Browser versions tested against:
Chrome 24.0.1312.56 m
Firefox 18.0.1


Description:
Destroyed Ext.tree.View is not removed from the TreeStore's event listeners. I have a window that has a treepanel. When I close and reopen the window the same TreeStore is reused and tried to be loaded. During store load beforefill event is called for the destroyed view and gives error.


Steps to reproduce the problem:
I've modified the treegrid.js example in order to place treepanel inside a window to reuse it. I've presented it as a test case.


Test Case:

Code:
Ext.Loader.setConfig({
    enabled: true,
    disableCaching: false
});Ext.Loader.setPath('Ext.ux', '../ux');


Ext.require([
    'Ext.data.*',
    'Ext.grid.*',
    'Ext.tree.*',
    'Ext.ux.CheckColumn'
]);


Ext.onReady(function() {
    Ext.QuickTips.init();


    //we want to setup a model and store instead of using dataUrl
    Ext.define('Task', {
        extend: 'Ext.data.Model',
        fields: [
            {name: 'task',     type: 'string'},
            {name: 'user',     type: 'string'},
            {name: 'duration', type: 'string'},
            {name: 'done',     type: 'boolean'}
        ]
    });


    var store = Ext.create('Ext.data.TreeStore', {
        model: 'Task',
        proxy: {
            type: 'ajax',
            //the store will get the content from the .json file
            url: 'treegrid.json'
        },
        folderSort: true
    });


    var button = Ext.create('Ext.Button', {
      renderTo: 'show-tree-button',
      text: 'Show Tree',
      handler: function() {
        var tree2 = Ext.create('Ext.tree.Panel', {
            title: 'Core Team Projects',
            width: 500,
            height: 300,
            collapsible: true,
            useArrows: true,
            rootVisible: false,
            store: store,
            multiSelect: true,
            singleExpand: true,
            //the 'columns' property is now 'headers'
            columns: [{
                xtype: 'treecolumn', //this is so we know which column will show the tree
                text: 'Task',
                flex: 2,
                sortable: true,
                dataIndex: 'task'
            },{
                //we must use the templateheader component so we can use a custom tpl
                xtype: 'templatecolumn',
                text: 'Duration',
                flex: 1,
                sortable: true,
                dataIndex: 'duration',
                align: 'center',
                //add in the custom tpl for the rows
                tpl: Ext.create('Ext.XTemplate', '{duration:this.formatHours}', {
                    formatHours: function(v) {
                        if (v < 1) {
                            return Math.round(v * 60) + ' mins';
                        } else if (Math.floor(v) !== v) {
                            var min = v - Math.floor(v);
                            return Math.floor(v) + 'h ' + Math.round(min * 60) + 'm';
                        } else {
                            return v + ' hour' + (v === 1 ? '' : 's');
                        }
                    }
                })
            },{
                text: 'Assigned To',
                flex: 1,
                dataIndex: 'user',
                sortable: true
            }, {
                xtype: 'checkcolumn',
                header: 'Done',
                dataIndex: 'done',
                width: 40,
                stopSelection: false
            }, {
                text: 'Edit',
                width: 40,
                menuDisabled: true,
                xtype: 'actioncolumn',
                tooltip: 'Edit task',
                align: 'center',
                icon: '../simple-tasks/resources/images/edit_task.png',
                handler: function(grid, rowIndex, colIndex, actionItem, event, record, row) {
                    Ext.Msg.alert('Editing' + (record.get('done') ? ' completed task' : '') , record.get('task'));
                },
                // Only leaf level tasks may be edited
                isDisabled: function(view, rowIdx, colIdx, item, record) {
                    return !record.data.leaf;
                }
            }]
        });


        var win = Ext.create('Ext.Window', {
          items: tree2,
          listeners: {
            'boxready': function() {
              if (!store.isLoading())
                store.load();
            },
            scope: this
          }
        });


        win.show();
      },
      scope: this
    });


});
I couldn't find a way to overcome this bug. So I'm hoping, until the bug is fixed in source code someone will present a temporary fix.

Ipek