1

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

但如果我试试这个:

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

myController 未定义并且 init 和 launch 没有被触发。

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

4

3 回答 3

2

this.getApplication()在 Sencha Touch 2.x 的几个最新版本中没有使用。要获取您需要运行的应用程序实例:

yourAppName.app.getController(...)

于 2013-05-18T19:48:21.587 回答
2

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

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

注意:这意味着您可能需要显式加载您的商店或创建您的视图,因为它们可能不会自动创建。同样在开发模式下,ExtJS 会“推荐”你将它们放在 app.js 中,你需要忽略它。“[Ext.Loader] Synchronously loading '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'
    ]
于 2014-06-17T20:54:22.720 回答
0

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

示例代码::

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

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

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

于 2013-05-21T16:36:10.750 回答