学习Extjs MVC框架发现的问题——requires.push is not a function

本文记录了作者在使用ExtJS4框架开发过程中遇到的问题及解决办法。主要问题是由于配置错误导致应用无法正常启动,并最终通过调整requires属性配置解决了该问题。

        昨天在学习Extjs4时,按照文档的代码写了一遍,发现无法运行,代码如下:

         app.js:


Ext.application({
    requires: 'Ext.container.Viewport',
    name: 'AM',
    controllers: ['Users'],
    appFolder: 'app',

    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'fit',
            items: [
                {
                    xtype: 'panel',
                    title: 'Users',
                    html : 'List of users will go here'
                }
            ]
        });
    }
});

       User.js

Ext.define('AM.controller.Users', {
    extend: 'Ext.app.Controller',

    init: function() {
        this.control({
            'viewport > panel': {
                render: this.onPanelRendered
            }
        });
    },

    onPanelRendered: function() {
        console.log('The panel was rendered');
    }
});

    index.htm

<html>
<head>
    <title>Hello Ext</title>

    <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css">
    <script type="text/javascript" src="extjs/ext-debug.js"></script>
    <script type="text/javascript" src="app.js"></script>
</head>
<body></body>
</html>

运行时,页面老是一片空白。用firebug调试发现,提示错误:

requires.push is not a function。


发现问题出在app.js: controller:['Users']上,一旦去掉这句话,页面是能出来的,一加上,问题就会出来。最后发现,extjs包里的Application.js运行app的代码如下:


var requires = config.requires || [],
            controllers, ln, i, controller,
            paths, path, ns;

........

if (this.autoCreateViewport) {
            requires.push(this.getModuleClassName('Viewport', 'view'));
        }
.......

其中,config.requires就是app.js中requires属性,这里的变量requires是个数组,而我的app.js的requires属性配置不是数组,所以导致这里的变量requires=config.requires||[ ]变成了一个字符串,而不是数组,以致运行到requires.push的时候,提示这个function不存在,所以只要把app.js里,requires属性改成如下:


requires:['Ext.container.Viewport']


问题解决。微笑

### 解决ExtJS中`ext.define is not a function`错误的原因及方案 在ExtJS开发中,遇到`ext.define is not a function`错误通常表明ExtJS框架未正确加载或存在版本不匹配的问题[^1]。以下是对该问题的详细分析和解决方案。 #### 错误原因 1. **ExtJS未正确加载**:如果ExtJS的核心文件未被正确引入,`Ext.define`方法将无法识别。这可能是由于路径配置错误或文件名拼写错误导致的。 2. **版本冲突**:不同版本的ExtJS可能具有不同的API定义。例如,在较新的ExtJS版本中使用了旧版本的代码结构,可能导致此类错误[^4]。 3. **命名空间问题**:如果项目中存在多个JavaScript库且命名空间冲突,可能会覆盖ExtJS的核心功能,从而引发此错误[^3]。 #### 解决方案 以下是针对上述原因的具体解决方法: #### 1. 确保ExtJS核心文件正确加载 检查HTML文件中是否正确引用了ExtJS的核心文件。例如: ```html <script src="path/to/ext-all.js"></script> ``` 确保路径正确且文件存在。如果使用的是特定版本的ExtJS,还需确认文件是否与版本匹配[^1]。 #### 2. 检查ExtJS版本兼容性 如果项目中混用了不同版本的ExtJS代码,需统一版本。例如,若使用的是ExtJS 4.x版本,则应避免引入ExtJS 3.x的代码结构。可以通过以下方式验证版本: ```javascript console.log(Ext.versions); ``` 根据输出结果调整代码以适配当前版本[^4]。 #### 3. 避免命名空间冲突 如果项目中引入了其他JavaScript库,需确保它们不会覆盖ExtJS的核心方法。例如,可以使用以下方式检测是否存在冲突: ```javascript if (typeof Ext !== 'undefined') { console.log('ExtJS is loaded'); } else { console.error('ExtJS is not loaded'); } ``` 如果发现冲突,可以通过调整加载顺序或使用独立的命名空间来解决问题[^3]。 #### 示例代码 以下是一个正确的ExtJS组件定义示例: ```javascript Ext.define('MyApp.model.User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'email'] }); ``` 确保在调用`Ext.define`之前,ExtJS框架已成功加载。 #### 注意事项 - 在调试过程中,建议启用浏览器开发者工具查看控制台中的错误信息。 - 如果使用模块化加载(如AMD或CommonJS),需确保模块依赖关系正确配置。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值