ExtJs 4重新加载应用程序
问题描述:
在我的应用程序中,所有组件的标题/文本都是基于应用程序启动之前加载的商店本地化的。在应用程序,我有按钮,改变商店网址,并重新加载商店切换语言。问题是所有的类都已经被加载,所以组件以先前的语言环境呈现。这里是按钮的代码:ExtJs 4重新加载应用程序
tbar: [{
xtype: 'button',
id: 'btn-test',
text: 'xxx',
handler: function() {
lang = 'en';
i18n.getBundlestore().load({url:'/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties'});
//bun = Ext.create('I18N.ResourceBundle');
Ext.getCmp('mainview').destroy();
Ext.create('Ext.container.Viewport', {
id: 'mainview',
layout: 'border',
items: [
{
xtype: 'gsip_mainpanel',
region: 'center',
items: [{
xtype: 'gsip_categoriestabpanel'
}]
}
]
完全相同的视口创建是在我的Application.js。 lang和i18n是全局变量。旧的视口被破坏,新的被创建,但如何强制重新加载classess。我不想使用window.location。
代码更新:
handler: function() {
lang = 'en';
Ext.getCmp('mainview').destroy();
i18n.getBundlestore().load({url:'/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties',
callback: function() {
Ext.create('Ext.container.Viewport', {
id: 'mainview',
layout: 'border',
items: [
{
xtype: 'gsip_mainpanel',
region: 'center',
items: [{
xtype: 'gsip_categoriestabpanel'
}]
}
]
});
}
});
}
CategoriesTabPanel:
Ext.define('GSIP.view.CategoriesTabPanel' ,{
extend: 'Ext.tab.Panel',
alias : 'widget.gsip_categoriestabpanel',
layout: 'fit',
items: [{
xtype: 'gsip_planytabpanel',
title: i18n.getMsg('key-1')
},{
xtype: 'gsip_adresytabpanel',
title: i18n.getMsg('key-2')
}],
initComponent: function() {
this.callParent(arguments);
}
});
和资源包化(i18n变量是这个类的一个实例):
Ext.define('I18N.ResourceModel',{
extend: 'Ext.data.Model',
fields: ['key', 'value']
});
Ext.define('I18N.ResourceStore',{
extend: 'GSIP.core.RegisteredStore',
model: 'I18N.ResourceModel',
autoLoad: true,
proxy: {
type: 'ajax',
url: '/GSIP/resources/gsip/i18n/bundle-' + lang + '.properties',
reader: {
type: 'json',
root: 'pl',
successProperty: 'success'
}
}
});
Ext.define('I18N.ResourceBundle' ,{
config: {
bundlestore: Ext.create('I18N.ResourceStore'),
},
constructor: function(config) {
this.initConfig(config);
return this;
},
getMsg: function(key) {
return this.bundlestore.getAt(this.bundlestore.findExact('key', key)).get('value');
}
},function(){
//callback function, called before store load :(
}
);
答
在widget.gsip_categoriestabpanel你设置的项目作为一个配置的定义。这意味着它将始终引用相同的对象(而不是更新的对象)。作为第一步,您应该将项目定义移至initComponent,在那里您还可以使用console.log(i18n)来查看它是否正确。
虽然可能没有解决您的问题,但您的代码存在问题:商店负载是异步的,所以很有可能在商店加载之前创建新的视口。你应该真的销毁旧视图并在传递给load方法的回调中创建新视图。 – Izhaki 2012-07-10 08:44:05
你是对的,应该在回调函数中重新创建视口。我更新了代码。它仍然不能解决我的问题。 – patryks 2012-07-10 09:51:10
您能否提供'gsip_categoriestabpanel'的代码?我怀疑你要么在对象中引用配置。 – Izhaki 2012-07-10 10:57:39