是否可以将 Ext.Component 声明为全局变量

Is it possible to declare Ext.Component as global variables?

本文关键字:声明 全局变量 Component Ext 是否      更新时间:2023-09-26

我在优化我的Sencha Touch 2应用程序时多次遇到这个问题。

很明显,我应该保持 DOM 轻量级,我的应用程序包含一个Ext.TabBar和一个上面的主Ext.Container。每次从一个视图切换到另一个视图时,我只需删除当前视图并向该容器添加新视图即可。

但问题是,有些视图具有自定义数据。我的意思是他们有内部数据,例如 html 内容、过滤的商店记录等。当我从主容器中删除它们时,我想以某种方式将它们的"状态"保存到全局变量中,例如:我正在做一个电子商务应用程序,其中包含带有详细信息的产品。从主容器中删除详细信息面板时,我想做这样的事情:

var saved_detail_panel = mainContainer.getActiveItem();

如果我能做到这一点,以后当我想将该详细信息面板添加回主容器时,我可以简单地使用:

mainContainer.add(saved_detail_panel);

我已经尝试了很多次,但还没有找到一个有效的。

非常感谢任何帮助。谢谢。

更新:当我将此代码放在控制器的事件处理程序中时:

var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
taxi.main_container = temp;

它运行良好,但性能不佳。我想做的是只在我的应用程序中创建一次.js,如下所示:

launch: function(){
var temp = Ext.create('taxi.view.location.LocationPanel', {showAnimation: null});
};

并且仅在控制器中使用它:

taxi.main_container = temp;

它是第一次工作。但在第二次中,它显示此错误:

Uncaught TypeError: Cannot call method 'replaceCls' of null 

您可以使用应用程序的"全局命名空间"吗? 然后,您可以在应用程序中的任何位置引用MyApp.savedValue?

Ext.application({    名称:"我的应用",观看次数: [],型号: [],商店: [],    控制器:["主"],    启动: 函数() {        MyApp.savedValue = "Hello word";        Ext.Viewport.add(Ext.create('Sencha.view.tablet.MainView'));    }});

Sencha示例中的另一个想法是在KitchenSink演示中。 在 app/controllers/Main.js 中,它们使用视图缓存,该缓存在 config:{} 中设置并通过 getter/setter 访问。 我认为主控制器始终存在,因此您的缓存始终可用。 事实上,如果将它们加载到应用程序中,不是所有控制器都会保留吗.js?

控制器: ['主', 'FooController', 'BarController'],

代码段来自:应用/控制器/主.js

配置:{       /**         * @private         */       viewCache: [],//通过 getViewCache(), setViewCache() 访问        ...}, 创建视图: 函数(名称) {        var cache = this.getViewCache(),//Implied getter            ln = cache.length,            限制 = 20,//要缓存的最大视图数            视图,我,旧视图;       查看视图是否已在缓存中并将其返回        Ext.each(cache, function(item) {            if (item.viewName === name) {                视图 = 项目;                返回;            }        },这个);        如果(查看){            返回视图;        }        如果我们已经达到缓存限制,请删除某些内容        if (ln>= limit) {            for (i = 0; i <ln;>

试试这个,

var appNS = new Ext.application({
    name: 'app',
    //others
    launch: function () {    
        appNS.SavedValue = 'getting start..........';       
    },
    //others
});

然后你可以在控制器内部使用它

console.log(appNs.SavedValue);

我希望这可能会有所帮助。

另一个 soln 是缓存您的视图。 它实际上不是缓存。首先向应用程序添加一个数组,例如 .

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