Ext.define()命令

时间:2014-12-11 12:55:22

标签: class extjs

我正在使用Extjs5和Sencha Cmd,我正在使用l10n引擎(通过gettext)来实现本地化。

假设我想为项目的每个类提供翻译功能,名为 _()

在每个控制器,视图,模型和任何类中,我都希望能够写出类似的东西:

Ext.define('FooClass', {
  someStrings: [
    _('One string to translate'),
    _('A second string to translate'),
    _('Yet another string to translate')
  ]
});

第一个问题:在项目的所有Ext.define()执行之前,_()必须存在。怎么实现呢?

第二个问题:_()正在查找“目录”,这些目录是从.po文件(gettext)生成的一些JavaScript文件。因此,在执行我的应用程序的所有Ext.define()之前,必须已加载这些目录。  _()是一个同步函数,必须立即返回已翻译的字符串。

2 个答案:

答案 0 :(得分:2)

关于已修改问题的修改

您至少有两种方法可以加载外部库:

Ext.Loader.loadScript

loadScript( options )
     

加载指定的脚本URL并调用提供的回调。如果   在Ext.isReady之前调用此方法,脚本的加载将延迟   过渡到准备好了。这可以用于加载任意脚本   可能包含进一步的Ext.require调用。

     

<强>参数

options : Object/String/String[] //The options object or simply the URL(s) to load.
// options params:
url : String //The URL from which to load the script.
onLoad : Function (optional) //The callback to call on successful load.
onError : Function (optional) //The callback to call on failure to load.
scope : Object (optional) //The scope (this) for the supplied callbacks.

如果您仍然遇到问题,可以强制加载程序进行同步加载:

syncLoadScripts: function(options) {
    var Loader = Ext.Loader,
        syncwas = Loader.syncModeEnabled;
    Loader.syncModeEnabled = true;
    Loader.loadScripts(options);
    Loader.syncModeEnabled = syncwas;
}

将其放在ExtJS库之后和生成的app.js之前的文件中。


旧答案

您需要在需要时提供课程,这样才能解决您的问题。如果你不需要sencha命令/ ExtJS类系统不能知道你需要一个特定的类。

Ext.define('Class1', {
  requires: ['Class2'], 
  items: [
    {
      xtype: 'combo',
      fieldLabel: Class2.method('This is a field label')
    }
  ]
});

如需进一步阅读,请查看:

<强> requires

requires : String[]
     

在实例化之前必须加载的类的列表   类。例如:

Ext.define('Mother', {
    requires: ['Child'],
    giveBirth: function() {
        // we can be sure that child class is available.
        return new Child();
    }
});

<强> uses

uses : String[]
     

与此类一起加载的可选类列表。这些   在创建此类之前不是必须加载,但是   保证在调用Ext.onReady侦听器之前可用。   例如:

Ext.define('Mother', {
    uses: ['Child'],
    giveBirth: function() {
        // This code might, or might not work:
        // return new Child();

        // Instead use Ext.create() to load the class at the spot if not loaded already:
        return Ext.create('Child');
    }
});

答案 1 :(得分:1)

在ExtJs项目范围之外定义translate函数,并在Ext.html应用程序包含在index.html之前包含它。 脚本按正确的顺序加载,_()函数可以在整个项目中使用。

<强> i18n.js

function _() {
    // do the translation
}

<强>的index.html

<html>
    <head>
        <script src="i18n.js"></script>
        <script id="microloader" type="text/javascript" src="bootstrap.js"></script>
    </head>
    <body>

    </body>
</html>