setController()不加载文件,也不启动init和启动

时间:2013-05-17 15:38:37

标签: extjs sencha-touch sencha-touch-2

我想在特殊情况下在运行时加载一些控制器。在这段视频中,http://de.slideshare.net/senchainc/mvc-in-depth-part-2-tommy-maintz/表示您可以使用getController执行此操作。如果此时未加载控制器,则加载文件并触发init和启动控制器。

但如果我试试这个:

var myController = this.getApplication().getController("MyController"); myController.test(); //-- Uncaught TypeError: Cannot call method 'test' of undefined

myController未定义,并且不会触发init和launch。

这个功能在sencha 2.2中不再存在吗?我是否必须在应用程序的“控制器”数组中包含所有控制器?应用程序启动后还有其他方法可以加载控制器吗?

3 个答案:

答案 0 :(得分:2)

Sencha Touch 2.x的几个最新版本中未使用

this.getApplication()。要获取应用程序实例,您需要运行:

yourAppName.app.getController(...)

答案 1 :(得分:2)

有几个非常有效的理由可以做到这一点,其中最重要的原因是并非所有应用都必须首先加载,这可以加快速度。它还允许您仅根据用户权限或用户会话期间执行的操作来加载应用程序的某些部分。在我的桌面应用程序中,我的部分只能由管理员用户查看,因此我使用MyApp.app.getController(' AppControllerAdministration')来获取类加载器以加载管理控制器。

SashaZd的评论实际上并不正确,至少在我的经验中。我从"控制器中取出控制器"应用程序中的数组并使用getController强制加载它。否则它会在app启动时出现,这是我认为OP试图避免的。至少在4.2.2(使用Sencha Architect 3)中,对我来说有用的是删除对app.js中该控制器专用的任何商店,视图或模型的引用。然后,您可以将它们放入控制器" s""" model"," store"配置(例如在帖子结束时)。因此,在我的应用程序中,如果我检查权限并且用户是管理员,我会为管理UI创建控制器,并且还需要加载所需的所有商店,视图和模型。但是在我这样做之前他们不在那里。您可以在调试器中看到它们被加载。

注意:这意味着您可能需要显式加载商店或创建视图,因为它们可能不会自动创建。同样在开发模式下,ExtJS将推荐"你把它们放在app.js中,你需要忽略它。像" [Ext.Loader]同步加载' MyApp.controller.EditUserController';考虑在Ext.onReady"上面添加Ext.require(' MyApp.controller.EditUserController')实际上正是你想要的!

您还可以选择根据用户操作加载控制器。我使用下拉列表的值在AppControllerAdministration.js中执行此操作:

var controllerName = 'MyApp.controller.Edit' + resourceType + 'Controller',
    newController = this.application.getController(controllerName),

要小心,您需要确保newController实际上已正确加载。

作为所有这些的一个例子,这是我的控制器声明的开始:

Ext.define('MyApp.controller.AppControllerAdministration', {
    extend: 'Ext.app.Controller',

    models: [
        'Resource',
        'EditorSection',
        'Permission',
        'Role'
    ],
    stores: [
        'Resources',
        'Roles',
        'Users',
        'Routes'
    ],
    views: [
        'EditRoles',
        'EditUsers',
        'EditRoutes'
    ]

答案 2 :(得分:0)

您是否已将控制器添加到app.js文件中的控制器列表?

示例代码::

Ext.application({
    name: 'myApp',
    requires:[
        'Ext.TitleBar'
    ],
    controllers: ['myDefaultController', 'onlyWhenCalledController', 'otherRandomController'],
. . . . 
});

只有这样做,才能使用getController函数。否则你调用的控制器是未定义的。

除此之外,当然,您需要在应用程序的控制器文件夹下为您的同名控制器运行代码。当上述两个都在您的应用程序中时,只有这样您上面调用的函数才能完美运行。