Extjs 与所有实例共享类配置

Posted

技术标签:

【中文标题】Extjs 与所有实例共享类配置【英文标题】:Extjs share class config with all instances 【发布时间】:2013-06-27 08:29:12 【问题描述】:

我的目标是与该类的所有实例共享类User 的配置属性langlang 将保存一个翻译类 Language 的实例,它会异步加载数据。

问题是我无法在配置中获取回调来调用实例的函数。

Ext.define( 'X.User.controller.Main', 
  extend: 'Deft.mvc.ViewController',

  config: 
     // create one Language instance once for all User instances
     lang: Ext.create( 'X.Language.Main',  
        loaded: false,
        language: 'de', 
        // this callback gets called correctly after loading language resources
        callback: function()  
           // ERROR since "this" is window, not the User instance
           this.lang.loaded = true; // should mark it loaded for next instances
           this.start(); // should start the instance logic
        
      )
  ,

  init: function() 
     var that = this;
     if( that.lang && that.lang.loaded )
     
        that.start();
     
  ,

  start: function() 
     // use the translation functions...
     oView.setLoading( that.lang.get( 'checkingPrivileges' ) );
     ...
  

我怎样才能让它工作?这种情况有更好的设计吗?


回调调用:

constructor: function( oConfig ) 
     var that = this;
     that.getLanguageFile( oConfig );
     that.initConfig( oConfig );


getLanguageFile: function( oConfig ) 
   var fCallback = oConfig.callback || Ext.emptyFn;
   ...
   // in my ajax success function...
      fCallback();

【问题讨论】:

【参考方案1】:

从“这是窗口”判断你调用回调函数的方式是错误的。这里没有代码,但您似乎直接调用它callback(arg),要使用上下文进行调用,您应该使用callback.call(scope, arg)之类的范围

问题是您的 X.Language.Main 实例在 X.Language.Main 之前启动,这就是您没有范围的原因。之后做:

Ext.define( 'X.User.controller.Main', 
  extend: 'Deft.mvc.ViewController',         

  init: function() 
      var lang = Ext.create( 'X.Language.Main',  
        loaded: false,
        language: 'de', 
        callback: function()  
           this.lang.loaded = true; // should mark it loaded for next instances
           this.start(); // should start the instance logic
        ,
        scope: this
      );

      this.config = lang: lang;

      var that = this;
      if( that.lang && that.lang.loaded )
        that.start();
      
  ,
  ....

然后使用作用域调用它或使用绑定。

【讨论】:

谢谢。我尝试使用Ext.bindExt.bind( this.start, this ); 仍然无法正常工作。 谢谢,但这将为每个 User 类创建一个 Language 类的新实例。我希望为所有 User 类只创建一次 Language 您的语言实例是为每个用户实例单独配置的。你不能使用配置来做到这一点。使用静态函数并将范围作为参数传递。【参考方案2】:

我目前的解决方案是:

Ext.define( 'X.plugins.language.Main', 
  config: 
     loaded: null,
     plugin: null,
     translations: null,
     listening: false
  ,
  constructor: function( oConfig ) 
     this.initConfig( oConfig );
  ,
  ...

所有其他的类都是这样的:

Ext.define( 'X.plugins.usermanagement.controller.Main',      
  config: 
     language: Ext.create( 'X.plugins.language.Main', 
        plugin: 'usermanagement'
      )
  ,

  init: function() 
     this.language.init( 
        callback: Ext.bind( that.start, that )
      );
  ,
  start: function()  // now start the plugin  

【讨论】:

以上是关于Extjs 与所有实例共享类配置的主要内容,如果未能解决你的问题,请参考以下文章

单一与共享所有权的含义

Ext JS 4 - 共享同一存储的网格实例

同一线程中类的所有实例中的类的共享数据成员

静态变量与实例变量:区别?

共享变量 static

java开发中所有静态变态变量写一个类