Javascript 是否可以将Ext.Component声明为全局变量?
在优化我的Sencha Touch 2应用程序时,我多次遇到这个问题 很明显,我应该保持DOM的轻量级,我的应用程序包含一个Javascript 是否可以将Ext.Component声明为全局变量?,javascript,sencha-touch-2,Javascript,Sencha Touch 2,在优化我的Sencha Touch 2应用程序时,我多次遇到这个问题 很明显,我应该保持DOM的轻量级,我的应用程序包含一个Ext.TabBar和上面的一个主Ext.Container。每次从一个视图切换到另一个视图时,我只需删除当前视图并向该容器添加新视图 但问题是,有些视图具有自定义数据。我的意思是,它们有内部数据,如html内容、筛选的商店记录等。当我将它们从主容器中删除时,我想以某种方式将它们的“状态”保存到一个全局变量中,例如:我正在使用带有详细信息的产品制作一个电子商务应用程序。从主
Ext.TabBar
和上面的一个主Ext.Container
。每次从一个视图切换到另一个视图时,我只需删除当前视图并向该容器添加新视图
但问题是,有些视图具有自定义数据。我的意思是,它们有内部数据,如html内容、筛选的商店记录等。当我将它们从主容器中删除时,我想以某种方式将它们的“状态”保存到一个全局变量中,例如:我正在使用带有详细信息的产品制作一个电子商务应用程序。从主容器中移除“详细信息”面板时,我希望执行以下操作:
var saved_detail_panel = mainContainer.getActiveItem();
launch: function(){
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
};
如果我能做到这一点,稍后当我想将该细节面板添加回主容器时,我可以简单地使用:
mainContainer.add(saved_detail_panel);
我试了很多次,但还没有找到一个有效的
非常感谢您的帮助。多谢各位
已更新:
当我将此代码放入控制器中的事件处理程序时:
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
taxi.main_container = temp;
taxi.main_container = temp;
它运行良好,但性能不佳。我想做的事情是只在我的app.js中创建一次,如下所示:
var saved_detail_panel = mainContainer.getActiveItem();
launch: function(){
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
};
并且仅在控制器中使用此选项:
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
taxi.main_container = temp;
taxi.main_container = temp;
这是第一次奏效。但是在第二次,它显示了这个错误:
Uncaught TypeError: Cannot call method 'replaceCls' of null
你能使用应用程序的“全局名称空间”吗?然后您可以在应用程序中的任何位置引用MyApp.savedValue
Ext.application({
name: 'MyApp',
// views: [],
// models: [],
// stores: [],
controllers: ['Main'],
launch: function() {
MyApp.savedValue = "Hello word";
Ext.Viewport.add(Ext.create('Sencha.view.tablet.MainView'));
}
});
外部应用程序({
名称:“MyApp”,
//视图:[],
//型号:[],
//门店:[],
控制器:['Main'],
启动:函数(){
MyApp.savedValue=“Hello word”;
添加(Ext.create('Sencha.view.tablet.MainView');
}
});
Sencha示例中的另一个想法是厨房水槽演示。在中,它们使用视图缓存,该缓存在config:{}中设置,并通过getter/setter访问。我认为主控制器始终存在,因此缓存始终可用。事实上,如果你的所有控制器都加载到app.js中,它们不是都会持久存在吗
controllers: ['Main','FooController', 'BarController'],
控制器:['Main','FooController','BarController'],
以下代码片段:
配置:{
/**
*@私人
*/
viewCache:[],//通过getViewCache()和setViewCache()访问
...
},
createView:函数(名称){
var cache=this.getViewCache(),//隐含的getter
ln=cache.length,
limit=20,//要缓存的最大视图数
视图,i,oldView;
//查看视图是否已在缓存中并返回它
Ext.each(缓存、函数(项){
如果(item.viewName==名称){
视图=项目;
返回;
}
},这个);
如果(视图){
返回视图;
}
//如果已达到缓存限制,请删除某些内容
如果(项次>=限制){
对于(i=0;ivar appNS = new Ext.application({
name: 'app',
//others
launch: function () {
appNS.SavedValue = 'getting start..........';
},
//others
});
然后您可以在控制器内部使用它
console.log(appNs.SavedValue);
我希望这可能会有所帮助。另一个解决方案是缓存您的视图。它实际上不是缓存。 首先向应用程序中添加一个数组,如
Ext.application({
name: 'app',
viewCache: [],
viewCacheCount: 0,
launch: function () {
this.viewCache.push("app init......."); // push your view
}
});
这可以在任何控制器内部检索,比如
ths.getApplication().viewCache.pop(); //pop your view
我不知道如果某些视图/组件可自动销毁,它可能会产生一些问题。尝试在视图中添加
autoDestroy:false
Ext.define('JiaoJiao.view.personal.Card', {
extend: 'Ext.NavigationView',
xtype: 'personalContainer',
config: {
tab: {
title: '个人',
iconCls: 'user',
action: 'personalTab'
},
autoDestroy: false,
items: [
{
xtype:'personal',
store: 'Personals'
}
]
}
});
我尝试过很多次,但不幸的是,全局名称空间不起作用。它总是导致错误,无法直接更新。顺便问一下,你能解释一下有关
viewCache
的更多信息吗?我已经试着扩展到目前为止我所知道的内容。我也需要在某个时候弄清楚这一点。我认为您在开发方面领先了一点。请查看我的最新问题,这确实是我以前多次遇到的问题,我感到非常沮丧..不知道是否是像这样的ST2错误:。。。我在sencha-touch-all-debug.js中看到了大约20个replaceCl调用,你能看到从Chrome stacktrace调用的是哪一个吗?糟糕的是,我没有足够的耐心来回溯和调试这些核心源代码:(…即使我现在已经找到了解决方法,通过使用这样的方法:mainContainer.add({xtype:'LocationPanel',showAnimation:null});
Chrome开发工具中仍然显示了一个奇怪的错误:未捕获的TypeError:无法读取null的属性“dom”
不幸的是,这是局部变量,而不是全局变量