0

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

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

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

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;

它运行良好,但性能不佳。我想做的事情是只在我的app.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 
4

4 回答 4

1

你可以使用应用程序的“全局命名空间”吗?那么您可以在应用程序的任何位置引用 MyApp.savedValue 吗?

分机应用程序({
    名称:'我的应用程序',

// 浏览量:[],
// 楷模: [],
// 存储:[],
    控制器:['Main'],

    启动:函数(){
        MyApp.savedValue = "你好词";
        Ext.Viewport.add(Ext.create('Sencha.view.tablet.MainView'));
    }
});

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

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

片段来自:app/controllers/Main.js

配置:{
        /**
         * @私人的
         */
        viewCache: [], // 通过 getViewCache(), setViewCache() 访问

        ...
},

 创建视图:函数(名称){
        var cache = this.getViewCache(), // 隐含的 getter
            ln = 缓存长度,
            limit = 20, // 要缓存的最大视图
            视图,我,旧视图;

       // 查看视图是否已经在缓存中并返回
        分机(缓存,功能(项目){
            if (item.viewName === name) {
                视图=项目;
                返回;
            }
        }, 这个);

        如果(查看){
            返回视图;
        }

        // 如果我们已经达到缓存限制,那么删除一些东西

        如果 (ln >= 限制) {
            对于 (i = 0; i < ln; i++) {
                oldView = 缓存[i];
                if (!oldView.isPainted()) {
                    oldView.destroy();
                    cache.splice(i, 1);
                    休息;
                }
            }
        }
        // 创建视图并将其添加到缓存中
        view = Ext.create(name);
        view.viewName = 名称;
        缓存.推送(视图);
        this.setViewCache(缓存); // 隐含的设置器

        返回视图;
    },  
于 2012-04-26T20:25:40.897 回答
0

尝试这个,

var appNS = new Ext.application({

    name: 'app',
    //others

    launch: function () {    
        appNS.SavedValue = 'getting start..........';       
    },

    //others

});

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

console.log(appNs.SavedValue);

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

于 2012-06-01T14:08:34.353 回答
0

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

Ext.application({
name: 'app',


viewCache: [],

viewCacheCount: 0,


launch: function () {     

    this.viewCache.push("app init......."); // push your view

}
});

这可以在任何控制器内部检索,例如

ths.getApplication().viewCache.pop();      //pop your view

我不知道如果某些视图/组件是可自动销毁的,它可能会产生一些问题。

于 2012-06-01T14:22:40.603 回答
0

尝试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'
         }
     ]
 }
});
于 2012-06-20T03:48:14.150 回答