如何正确使用Ext.create

Faw*_*war 1 extjs sencha-touch-2 sencha-architect

在sencha文档中找不到关于此问题的任何相关信息:

是否可以Ext.create(...)使用不依赖于应用程序名称的参数进行调用?那么,如果我更改应用程序的名称,我不必重写那行代码?

通常情况下我会使用,Ext.create(AppName.model.MYMODEL)但这对我来说与应用程序的名称太相关了.

仍然需要帮助:)

Eri*_*ric 6

使用类别名创建

当使用Ext.define来定义你的类,你可以提供一个alias属性.您可能已经在使用别名的UI组件上看到过这种情况widget.panel.这些别名可以使用Ext.create.

Ext.define('MyApp.SomeClass', {
    alias: 'app.someclass',  // Independent of class name
    /* ... */
});

Ext.create('app.someclass', {
    /* ... */
});
Run Code Online (Sandbox Code Playgroud)

您可以在使用后创建类的别名Ext.ClassManager.setAlias.

使用应用程序名称的助手功能

如果您没有设置别名的选项,则可以创建一个包装Ext.create自动提供基本命名空间的函数.

这里的问题是Ext.application不返回应用程序对象.我不确定Sencha Architect如何生成应用程序代码,但您可能需要额外的覆盖以允许您检索应用程序对象.

function appCreate(className, config) {
    var appName = someMethodThatGetsTheApplicationName();
    return Ext.create(appName + '.' + className, config);
};

// Example usage: Creates object of MyApp.model.MyModel
var myObj = appCreate('model.MyModel', { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

如何在运行时获取应用程序名称

默认情况下,Ext JS在使用时不保留对应用程序对象的引用Ext.application,因此我们需要覆盖它来执行它.我正在使用它Ext.currentApp作为存储此对象的属性,但您可以将其更改为您想要的任何内容.

Ext.application = function (config) {
    Ext.require('Ext.app.Application');

    Ext.onReady(function () {
        Ext.currentApp = new Ext.app.Application(config);
    });
};
Run Code Online (Sandbox Code Playgroud)

现在您已经拥有了这个,只需使用即可访问应用程序名称Ext.currentApp.name.或者,如果您使用吸气剂感觉更舒服,可以使用以下物品.

Ext.app.Application.addMembers({
    getName: function () {
        return this.name;
    }
});

// Example usage:
function someMethodThatGetsTheApplicationName() {
    if (!Ext.currentApp) {
        Ext.Error.raise('Current app does not exist.');
    }
    return Ext.currentApp.getName();
}
Run Code Online (Sandbox Code Playgroud)