Why is my ExtJS singleton not working?
extjs, extjs4.2, singleton
Solution
In Ext JS you can define class as `singleton` or define normal class with `statics` methods. You can not define statics methods in singleton.
If you define class as `singleton` Ext JS class post-processor immediately creates an instance of that class, and in your case store the reference in `AM.localization.ResourceManager`. Then you can access singleton methods like `AM.localization.ResourceManager.initBundleLoader()`
Good explenation of difference between normal class with statics methods and singleton you can find in third post here: http://www.sencha.com/forum/showthread.php?128646-Singleton-vs-class-with-all-static-members
So your class definition should be:
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);
}
}
}
});
Problem
I have an ExtJS singleton class. As a test I am calling a method of it in app.js launch() function. But the singleton static method is not defined. I thought when I require the class the singleton becomes active? ``` 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); } } } } }); ```