Extjs布局扩展导致ext-all.js中的错误

时间:2010-11-10 03:26:01

标签: javascript extjs

我正在努力学习Extjs,我马上想出一个问题。我的Html正确包含ext-base.jsext-all.js。然后我在我的js文件中有以下内容:

Ext.BLANK_IMAGE_URL = '<%= Url.Content("~/Content/ext/images/default/s.gif") %>';
Ext.ns('MyNamespace');

Ext.onReady(function() {
    alert("onReady() fired");
});

到目前为止,一切正常,没有错误,并且正确地抛出了警报。然后我在onReady之后添加以下代码:

MyNamespace.BaseLayout = Ext.Extend(Ext.Viewport({
    layout: 'border',
    items: [
        new Ext.BoxComponent({
            region: 'north',
            height: 32,
            autoEl: {
                tag: 'div',
                html: '<p>North</p>'
            }
        })
    ]
}));

这导致chrome中出现以下javascript错误:

Uncaught TypeError: Object #<an Object> has no method 'addEvents'       ext-all.js:7
Ext.Component       ext-all.js:7
Ext.apply.extend.K       ext-base.js:7
Ext.apply.extend.K       ext-base.js:7
Ext.apply.extend.K       ext-base.js:7
(anonymous function)       MyApp.js:13 (pointing to the Ext.Extend line)

如果我将Viewport代码直接放入OnReady函数中(如下所示)

Ext.onReady(function () {
    var bl = new Ext.Viewport({
        layout: 'border',
        items: [
        new Ext.BoxComponent({
            region: 'north',
            height: 32,
            autoEl: {
                tag: 'div',
                html: '<p>North</p>'
            }
        })
    ]
    });
});

有效。谁能让我知道我在使用Extend方法做错了什么?

3 个答案:

答案 0 :(得分:2)

要修复代码,问题只是Extend语句中的错误语法。你需要在Ext.Viewport之后使用逗号,而不是额外的()对:

MyNamespace.BaseLayout = Ext.Extend(Ext.Viewport, {
    layout: 'border',
    items: [
        new Ext.BoxComponent({
            region: 'north',
            height: 32,
            autoEl: {
                tag: 'div',
                html: '<p>North</p>'
            }
        })
    ]
});

但是,我建议接受@ r-dub的建议,并阅读更多关于你想要做的事情。

答案 1 :(得分:1)

这是你想要完成的一个更复杂的例子。我强烈建议您看看Saki的3 part series使用ExtJS构建大型应用程序,它将帮助您了解如何正确使用扩展来创建可重用的组件。

Ext.ns('MyNamespace');

MyNamespace.BaseLayout = Ext.extend(Ext.Viewport, {
    initComponent:function() {
        var config = {
            layout: 'border',
            items: [
                new Ext.BoxComponent({
                    region: 'north',
                    height: 32,
                    autoEl: {
                        tag: 'div',
                        html: '<p>North</p>'
                    }
                })
            ]
        };
        Ext.apply(this, Ext.apply(this.initialConfig, config));

        MyNamespace.BaseLayout.superclass.initComponent.apply(this,arguments);
    }//end initComponent

});

//this will give you an xtype to call this component by.
Ext.reg('baselayout',MyNamespace.BaseLayout);

Ext.onReady(function() {
    new MyNamespace.BaseLayout({});
});

答案 2 :(得分:0)

ExtJS建议使用define而不是extend。以下是类似示例如何使用define:

 Ext.define('Grid', {
    extend: 'Ext.grid.Panel',
    config: {          
        height: 2000        
    },

    applyHeight: function (height) {           
            return height;
    }       
});

new Grid({
    store: store,
    columns: [{
        text: 'Department',
        dataIndex: 'DepartmentName',
        renderer: function (val, meta, record) {
            return '<a href="DepartmentEmployees/' + record.data.ID + '">' + record.data.DepartmentName + '</a>';
        },
        width: 440,
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Department Code',
        dataIndex: 'DepartmentKey',
        width: 100,
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Main Phone',
        dataIndex: 'MainPhone',
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Room',
        dataIndex: 'RoomLocation',
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Hideway Location',
        dataIndex: 'HideawayLocation',
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Hideway Phone',
        dataIndex: 'HideawayPhone',
        flex: 1,
        filter: 'string',
        sortable: true,
        hideable: false
    }, {
        text: 'Has OEC',
        dataIndex: 'OECFlag',
        xtype: 'checkcolumn',
        width: 50,
        filter: {
            type: 'boolean',
            active: true
        },
        flex: 1,
        sortable: true,
        hideable: false
    },
       {
           text: 'Action',
           dataIndex: 'ID',
           renderer: function (value) {
               return '<a href="DepartmentEdit/' + value + '">Edit</a>';
           },
           hideable: false
       }],
    forceFit: false,
    split: true,
    renderTo: 'departmentSearchGrid',
    frame: false,
    width: 1300,
    plugins: ['gridfilters']
});

我使用以下帖子作为参考: http://docs.sencha.com/extjs/5.0/core_concepts/classes.html