为什么我的ExtJS单身不能正常工作?

时间:2014-02-06 07:40:14

标签: extjs singleton extjs4.2

我有一个ExtJS单例类。

作为测试,我在app.js的launch()函数中调用它的方法。

但是没有定义单例静态方法。

我想当我需要班级时,单身人士会变得活跃吗?

Ext.Loader.setConfig({
    enabled : true,
    paths: {
        'AM': 'app'
    }
});


Ext.application({
    name: 'AM',
    autoCreateViewport: true,


    requires: [
        'AM.localization.ResourceManager'
    ],


    controllers: [
        'Users'
    ],


    launch: function() {
        alert(ResourceManager.initBundleLoader());
    }
});




Ext.define('AM.localization.ResourceManager', {
    alternateClassName: 'ResourceManager',
    singleton: true,

    init: function() {
        this.initBundleLoader();
    },

    statics: {
        test: 'here',
        initBundleLoader: function() {
            debugger;
            Ext.applyIf(Ext.Loader, {
                resourceBundles: new Object()
            });
        },

        registerBundle: function(bundleName, locale) {
            debugger;
            if(!Ext.Loader.hasOwnProperty('resourceBundles')) {
                this.initBundleLoader();
            }
            if(!Ext.Loader.resourceBundles.hasOwnProperty(bundleName)) {
                if(Ext.ClassManager.isCreated('AM.locale.' + locale + '.resources.' + bundleName)) {
                    this.resourceBundles.bundleName = Ext.create('AM.locale.' + locale + '.resources.' + bundleName);
                }
            }
        }
    }
});

1 个答案:

答案 0 :(得分:8)

在Ext JS中,您可以将类定义为singleton或使用statics方法定义普通类。您无法在单例中定义静态方法。

如果将类定义为singleton,则Ext JS类后处理器会立即创建该类的实例,并在您的情况下将引用存储在AM.localization.ResourceManager中。然后,您可以访问单AM.localization.ResourceManager.initBundleLoader()

等单一方法

正常类与静态方法和单例之间的区别很好,您可以在第三篇文章中找到:http://www.sencha.com/forum/showthread.php?128646-Singleton-vs-class-with-all-static-members

所以你的班级定义应该是:

Ext.define('AM.localization.ResourceManager', {
    alternateClassName: 'ResourceManager',
    singleton: true,

    init: function() {
        this.initBundleLoader();
    },

    test: 'here',
    initBundleLoader: function() {
        debugger;
        Ext.applyIf(Ext.Loader, {
            resourceBundles: new Object()
        });
    },

    registerBundle: function(bundleName, locale) {
        debugger;
        if(!Ext.Loader.hasOwnProperty('resourceBundles')) {
            this.initBundleLoader();
        }
        if(!Ext.Loader.resourceBundles.hasOwnProperty(bundleName)) {
            if(Ext.ClassManager.isCreated('AM.locale.' + locale + '.resources.' + bundleName)) {
                this.resourceBundles.bundleName = Ext.create('AM.locale.' + locale + '.resources.' + bundleName);
            }
        }
    }
});