【问题标题】:Different behavior of ExtJS application in debug and minified modeExtJS 应用程序在调试和缩小模式下的不同行为
【发布时间】:2012-03-22 17:34:25
【问题描述】:

我在当前正在处理的 Web 应用程序中遇到了一个奇怪的行为。界面完全使用 ExtJs 4 构建。应用程序有两种模式,Debug 和 Production。

在调试模式下,当用户单击菜单项时,我会同步加载依赖的 Javascripts 文件。像这样的东西:

for ( var i = 0; i < config.dependency.length; i++ ) {
   var element = document.createElement('script');

   element.onload = callback;
   element.onreadystatechange = function () {
      if ( element.readyState == 'loaded' || element.readyState == 'complete' ) {
         callback();
      }
   };
}

其中一个模块的 javascript 文件是这样的:
模块.js

Ext.define('Company.view.system.Module', {
   extend: 'Company.view.abstract.Panel', 
   alias: 'widget.system.module', 

   /**
    * These "_items" are built into the Object in `Company.view.abstract.Panel`
    * using: Ext.create(this._items[i].clazz, conf);
    *
    * I'm just omitting the whole business logic there
    */
   _items: [{
      flex: 2, 
      clazz: 'Company.view.system.module.Form'
   }, {
      flex: 5, 
      clazz: 'Company.view.system.module.HtmlEditor'
   }]
});

Ext.define('Company.view.system.module.Form', {
   extend: 'Company.view.abstract.Form', 
   alias: 'widget.system.module.form', 

   items: [{
      xtype: 'fieldset', 
      title: 'Module Grid', 

      items: [{
         xtype: 'system.module.grid'
      }]
   }]
});

Ext.define('Company.view.system.module.Grid', {
   extend: 'Company.view.abstract.Grid', 
   alias: 'widget.system.module.grid', 

   columns: [{
      ...
   }], 

    afterLayout: function() {
        this.callParent(arguments);
        alert('after layout');
    }
});

Ext.define('Company.view.system.module.HtmlEditor', {
   extend: 'Company.view.abstract.HtmlEditor', 
   alias: 'widget.system.module.htmleditor', 

   ...
});

在调试模式下一切正常。但是在生产模式下,我在启动时(即在呈现 ViewPort 之前)将整个模块加载为单个生成的缩小混淆的 javascript 文件 (modules.js),而不是在菜单单击事件之后加载依赖模块。

在生产模式下,使用“xtype”(上例中的Company.view.system.module.Grid)实例化的每个项目都不会被渲染!

Debug modeProduction Mode 的截图。

你认为我错过了什么?

更新: 问题在于 GridPanel 的Height,因为它是在运行时根据浏览器的屏幕大小计算得出的。因此,当组件被实例化时,高度尚未计算!愚蠢的错误:)

【问题讨论】:

    标签: javascript extjs extjs4


    【解决方案1】:

    我会尝试在 system.module.form 中使用它之前移动 system.module.grid 定义。

    【讨论】:

    • 没什么!它只是不会渲染子项目。我现在才检查了一下,奇怪的是,即使是网格存储也在工作,我可以在控制台中看到 XHR 日志
    • 由于“相同”代码在开发中有效,我的重点将放在 xtype 定义的时间上。必须在 create 方法使用它们之前定义它们。您能否通过吐出一些日志语句来验证您的代码是否实际加载到浏览器中?
    • 我已经更新了上面的示例代码,并添加了afterLayout 方法。它被称为。我在屏幕上收到 2-3 个警报
    • 所以你是说它确实被正确加载了?如果是这样,请获取 Illuminations for Developers firebug 插件的评估版本,看看发生了什么。
    • 我提到的插件可以让你检查你的 extjs 组件及其状态。它将突出显示他们的页面位置和许多其他有用的信息来帮助您调试。
    【解决方案2】:

    我建议使用两个不同的版本。你这样做的原因是什么?

    【讨论】:

    • 嗯,这实际上不是两个不同的版本。在开发中,我只是编写具有大量 cmets 和缩进等的应用程序并将其部署在服务器上。然后我将执行一个 bash 脚本,并缩小和混淆服务器上的所有内容。然后应用程序提取文件并将它们合并为一个文件,并将其发送给客户端
    • 为什么不在你的机器上使用 Sencha SDK 来缩小它?我认为这将是两个实际上相同的版本
    • 我指的是延迟加载您在调试环境中拥有的文件。
    • 是的,没错。在调试模式下加载有很多延迟,比如 70 个文件。但最终它不会发生在服务器上,特别是不会发生在最终用户身上。除此之外,我也在考虑在服务器上实现一个受密码保护的调试版本以用于开发目的。所以它将来也可能会派上用场。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多