【问题标题】:ExtJS4 modularization with stand-alone controllers?带有独立控制器的 ExtJS4 模块化?
【发布时间】:2012-04-17 15:36:15
【问题描述】:

我正在尝试将 ExtJS4 应用程序拆分为模块。

 - app
  - store
  - controller
  - model
  - view
  - module
     - m1
         - model
         - view
         - controller
     - m2
         - model
         - ...

问题是,当我启动应用程序并初始化其中一个 m1 控制器时,该控制器没有 this.control() 函数。

-- 编辑--

我在控制器文件夹中定义了一个类。

Ext.define( 'App.module.ping.controller.Ping', {
  extend: 'Ext.app.Controller',

  requires: [
     'App.module.ping.view.PingPanel'
  ],

  init: function() {
     this.control( {
        '#app.module.ping': {
           render: this.onPanelRendered
        }
     } );
  },

  onPanelRendered: function() {
     ...
  }

});

稍后我会打电话

Ext.create('App.module.ping.controller.Ping').init();

但我收到此错误:

Uncaught TypeError: Cannot call method 'control' of undefined
Ext.define.control./lib/extjs-4.1.0/src/app/Controller.js:414
Ext.define.init./app/module/ping/app/controller/Ping.js:11
Ext.define.init./app/module/ping/app/Module.js:11
(anonymous function)app.js:17
(anonymous function)app.js:35

Module.js 是带有 create() 调用的文件 Ping.js 是带有 define() 调用的文件

-- 编辑2--

病理例子:

输入:

Ext.define( 'MyController', { 
  extend: 'Ext.app.Controller', 
  init: function() { console.log('initialized'); } 
});

输出:

function constructor() {
  return this.constructor.apply(this, arguments);
}

输入:

Ext.create('MyController');

输出:

constructor

输入:

MyController.create();

输出:

constructor

-- 编辑3--

控制器在创建时需要配置对象中的应用程序对象。应用程序对象将自己添加到所有控制器中,这些控制器不是使用 create 手动创建的。它调用这样的东西:

Ext.create('App.controller.Users', { application: this, ... } );

稍后它使用应用程序对象将控制调用重定向到它。

control: function ( config ) { this.application.control( config ) };

所以我可能会实现一些机制,在创建这些控制器时自动将应用程序添加到这些控制器中。

【问题讨论】:

  • 控制器没有 control() 函数到底是什么意思?你能把你的一些代码贴在它发生的地方吗?
  • 错误信息对我没有帮助。控制被调用,但它说这是未定义的...... wat?!
  • 恭喜您找到了解决方案!也许它会让你重新使用他们喜欢的方法来组织源代码:) 我发现 ExtJs 在几个地方依赖于目录结构,因此决定不发明任何东西并按照他们的建议来组织东西。
  • 但我想要 app/module1/controller 而不是 app/controller/module1... 他们的首选方法我也会得到 app/view/module1 app/model/module1 等。我只想要一个目录其中包含模块需要插入其他应用程序并独立运行的所有内容:\

标签: model-view-controller extjs extjs-mvc


【解决方案1】:

你试过了吗

var pingController = Application.getController('App.module.ping.controller.Ping');
pingController.init(); //or pingController.init(Application);

其中 Application 是对 Ext.application.launch 期间创建的对象的引用 - 例如

var Application = {};
Ext.application({
    //all of your settings,
    launch:function(){
         Application = this;
         //other launch code
    }
}
});

【讨论】:

  • 这也有效,谢谢!它甚至比我的解决方案更好,因为我不必随身携带应用程序对象。
  • 在相应的视图中调用这个是个好主意吗?所以主模块 Controller 只有在视图需要时才会被加载。
  • 哪个视图?我不确定当您创建视图然后创建控制器而不是控制该视图时 ExtJS 的行为方式。我通常创建控制器 (C),然后立即创建 (C) 控制的视图。
  • 是的,我知道。但是最好在某个地方添加一个带有 xtype 的视图,并且视图会加载一些初始化控制器。使用这种方法,使用模块的应用程序不必知道模块是如何工作的。
【解决方案2】:

致所有来这里寻找解决方案的人:

Uncaught TypeError: Cannot call method 'control' of undefined

抛开一整天的挫败感,上面的答案并没有解决我的问题,但引导我尝试以下方法,确实解决了问题:

// app.js
Ext.application({
    ...

    launch: function(){
        var me = this;
        ...

        me.getController('ControllerName');
    }
});

// inside controller/ControllerName.js
init: function(app){
    var me = this;

    app.control({
        '#editButton': {
            click: function(){
                me.someFunction();
            }
        }
    });
},

该应用程序变量与为问题选择的答案中的“var Application = {}”相同——这意味着我不需要全局添加它(或根本不需要)。我一定尝试过一百万种不同的东西,但这终于奏效了。希望它能拯救别人。

【讨论】:

  • 哈哈,老问题:D 我后来改用 DeftJS,因为他们的视图控制器概念更适合我的模块系统。
  • 很高兴知道!我的情况更像是动态控制器陷入困境和怪异的情况。这是我发现的唯一一篇与我的问题很相似的帖子:(
【解决方案3】:

不需要手动调用init()。只要调用Ext.create,就会自动调用构造函数。

【讨论】:

  • 我将 log() 放入 init() 中。如果我手动调用它,我会得到日志输出和提到的错误。如果我只是调用 create() 我根本不会得到输出。
  • 即使你这样称呼它:c = Ext.create('App.module.ping.controller.Ping', {});?
  • 是的。我调试了 create() 调用中发生的所有事情,但从未进入 init()。也许这是 ExtJS 4.1 的行为?
  • 哦...是4.1吗?我还在 4.0.7... 如果您将其创建为 c = App.module.ping.controller.Ping.Create(); 怎么办?
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2011-05-07
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2017-05-01
相关资源
最近更新 更多