2012-04-17 60 views
2

我试图将ExtJS4应用程序拆分为模块。ExtJS4模块化与独立控制器?

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

的问题是,当我启动应用程序,它的inits 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与创建()调用 Ping.js的文件是文件与定义( )调用

- EDIT2 -

病理例如:

输入:

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

输出:

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

输入:

Ext.create('MyController'); 

输出:

constructor 

inpu T:

MyController.create(); 

输出:

constructor 

- EDIT3 -

创建时,控制器需要在配置对象的应用程序对象。应用程序对象将自身添加到所有控制器,这些控制器是用手工创建的而不是。它调用如下所示:

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

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

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

因此,我可能会实施一些机制,当我创建它们时,会自动将这些应用程序添加到这些控制器。

+1

你是什么意思'控制器没有控制()功能?你能发布一些你的代码吗? – sha 2012-04-17 17:15:39

+0

错误消息不帮助我。控制被称为这个,但它说这是未定义的...笏?! – 2012-04-18 09:06:06

+0

恭喜发现解决方案!可能它会依靠你的首选方法来组织源代码:)我发现ExtJs依赖于目录结构在几个地方,并决定不发明任何东西,并按照他们的建议组织事情。 – sha 2012-04-18 18:22:25

回答

1

你试过

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

凡申请是Ext.application.launch期间创建的对象的引用 - 如

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

这个也工作了,谢谢!它甚至比我的解决方案更好,因为我不必携带应用程序对象。 – 2012-04-19 08:42:34

+0

在相应视图中调用它是个好主意吗?所以主模块控制器只会在视图需要时加载。 – 2012-04-19 10:45:48

+0

哪个视图?我不确定ExtJS在创建视图时的行为,然后再创建控制器,而不是控制该视图。我通常创建控制器(C),然后立即创建(C)控制的视图。 – 2012-04-19 16:07:11

0

不需要手动拨打init()。只需拨打Ext.create即可自动调用构造函数。

+0

我将一个log()放入init()。如果我手动调用它,我会得到日志输出和提到的错误。如果我只是调用create(),我根本得不到输出。 – 2012-04-18 14:33:00

+0

即使你像这样调用它:'c = Ext.create('App.module.ping.controller.Ping',{});'? – sha 2012-04-18 14:43:08

+0

是的。我调试了create()调用中发生的所有事情,并且从未进入init()。也许这是ExtJS 4.1的行为? – 2012-04-18 14:53:44

1

为了谁比谁来这里寻找一个解决方案:

Uncaught TypeError: Cannot call method 'control' of undefined 

一天长沮丧撇开,上面的答案没有解决我的问题,b UT导致我尝试以下,这根本解决问题:

// 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应用= {}”这是在问题的选择答案 - 这意味着我没有”不需要将其添加到全局(或根本)。我一定曾尝试过一百万种不同的东西,但最终这一切都奏效了。希望它能拯救别人。

+0

哈哈,老问题:我后来改用了DeftJS,因为他们的视图控制器的概念更适合我的模块系统。 – 2013-10-25 16:30:36

+0

很高兴知道!矿井更像是一个动态控制器陷入泥潭和奇怪的情况。这是我发现的与我的问题类似的唯一帖子:( – 2013-10-25 18:53:40