Extjs 与所有实例共享类配置
Posted
技术标签:
【中文标题】Extjs 与所有实例共享类配置【英文标题】:Extjs share class config with all instances 【发布时间】:2013-06-27 08:29:12 【问题描述】:我的目标是与该类的所有实例共享类User
的配置属性lang
。 lang
将保存一个翻译类 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.bind
,Ext.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 与所有实例共享类配置的主要内容,如果未能解决你的问题,请参考以下文章