javascriptextjstreeextjs4treepanel

Extjs 4 - creating a model for a tree panel


I would like to implement a tree panel with content loaded dynamically from the server (as Json) and with a custom data model. But I dont know how to define a model and a data store for that tree. Can you provide some examples? If possible, I'd like to conform to the sencha mvc recommendations (the model and the data store defined as separate classes). I knew how to do it in extjs 3 but i'm lost in version 4.

Best regards RG


Solution

  • I experimented with a new MVC approach recently, and I managed to get it work with the treepanel. Nothing special actually:

    View:

    Ext.define('RoleBuilder.view.RoleList', {
        extend: 'Ext.tree.Panel',
        alias: 'widget.roles',
        title: 'Roles',
        store: 'Roles'    
    });
    

    Store:

    Ext.define('RoleBuilder.store.Roles', {
        extend: 'Ext.data.TreeStore',
        model: 'RoleBuilder.model.Role',
        requires: 'RoleBuilder.model.Role',
        root: {
            text: 'Roles',
            expanded: true        
        },
        proxy: {
            type: 'ajax',
            url: loadRolesUrl,
            actionMethods: 'POST',
            reader: {
                type: 'json'
            }
        }
    });
    

    Model:

    Ext.define('RoleBuilder.model.Role', {
        extend: 'Ext.data.Model',
        fields: [
            { name: 'id', type: 'int', mapping: 'Id' },
            { name: 'text', type: 'string', mapping: 'Text' },
            { name: 'leaf', type: 'boolean', mapping: 'Leaf' },
            { name: 'loaded', type: 'boolean', mapping: 'Loaded', defaultValue: false },
            { name: 'Properties'},
            { name: 'expanded', defaultValue: true }
        ]
    });
    

    Controller:

    Ext.define('RoleBuilder.controller.RoleList', {
        extend: 'Ext.app.Controller',
        init: function () {
            this.control({
                'roles': {
                    itemcontextmenu: this.onItemContextMenuClick,
                    itemclick: this.onItemClick
                }
            });
    
            this.application.on({
                'role-saved': Ext.Function.bind(this.onRoleSaved, this)
            });
        },
    ..... too long, but you got the idea.
    

    Hope it will help.