2014-02-06 3 views
7

Ich habe eine ExtJS Singleton-Klasse.Warum funktioniert mein ExtJS Singleton nicht?

Als Test rufe ich eine Methode davon in app.js launch() -Funktion.

Aber die Singleton statische Methode ist nicht definiert.

Ich dachte, wenn ich die Klasse benötige wird der Singleton aktiv?

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); 
       } 
      } 
     } 
    } 
}); 

Antwort

8

In Ext JS Sie Klasse als singleton oder definieren normale Klasse mit statics Methoden definieren können. Sie können Statikmethoden nicht in Singleton definieren.

Wenn Sie Klasse als singleton definieren, erstellt der Ext-JS-Klassen-Postprozessor sofort eine Instanz dieser Klasse und speichert in Ihrem Fall die Referenz in AM.localization.ResourceManager. Dann sind Sie Singleton-Methoden wie AM.localization.ResourceManager.initBundleLoader()

Gut explenation des Unterschiedes zwischen normaler Klasse mit statischen Methoden und Singleton zugreifen können Sie in dritten Beitrag finden Sie hier: http://www.sencha.com/forum/showthread.php?128646-Singleton-vs-class-with-all-static-members

So sollte Ihre Klassendefinition sein:

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); 
      } 
     } 
    } 
}); 
+0

Funktioniert jetzt großartig. Danke für Ihre Hilfe! –