0

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;

それはうまく機能しますが、パフォーマンスは良くありません。私がやりたいのは、次のように、 app.jsで1回だけ作成することです。

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

これはコントローラーでのみ使用してください。

taxi.main_container = temp;

初めて動作します。しかし、2回目は、次のエラーが表示されます。

Uncaught TypeError: Cannot call method 'replaceCls' of null 
4

4 に答える 4

1

アプリの「グローバル名前空間」を使用できますか?次に、アプリのどこからでもMyApp.savedValueを参照できますか?

Ext.application({
    名前:'MyApp'、

//ビュー:[]、
//モデル:[]、
//ストア:[]、
    コントローラ:['メイン']、

    起動:function(){
        MyApp.savedValue="こんにちは言葉";
        Ext.Viewport.add(Ext.create('Sencha.view.tablet.MainView'));
    }
});

Senchaの例のもう1つのアイデアは、KitchenSinkデモにあります。app / controllers / Main.jsでは、config:{}で設定され、getter/setterを介してアクセスされるビューキャッシュを使用します。メインコントローラーは常に存続するので、キャッシュは常に利用可能だと思います。実際、app.jsにロードされている場合、すべてのコントローラーが持続するわけではありませんか?

コントローラ:['Main'、'FooController'、'BarController']、

スニペット:app / controllers / Main.js

構成:{
        / **
         * @プライベート
         * /
        viewCache:[]、// getViewCache()、setViewCache()を介してアクセス

        ..。
}、

 createView:function(name){
        var cache = this.getViewCache()、//暗黙のゲッター
            ln = cache.length、
            limit = 20、//キャッシュする最大ビュー
            ビュー、私、oldView;

       //ビューがすでにキャッシュにあるかどうかを確認し、それを返します
        Ext.each(cache、function(item){
            if(item.viewName === name){
                ビュー=アイテム;
                戻る;
            }
        }、 これ);

        if(表示){
            ビューを返す;
        }

        //キャッシュ制限に達した場合は、何かを削除します

        if(ln> = limit){
            for(i = 0; i <ln; i ++){
                oldView = cache [i];
                if(!oldView.isPainted()){
                    oldView.destroy();
                    cache.splice(i、1);
                    壊す;
                }
            }
        }
        //ビューを作成し、キャッシュに追加します
        ビュー=Ext.create(name);
        view.viewName=名前;
        cache.push(view);
        this.setViewCache(cache); //暗黙のセッター

        ビューを返す;
    }、  
于 2012-04-26T20:25:40.897 に答える
0

別の解決策は、urビューをキャッシュしています。実際にはキャッシングではありません。まず、のような配列をアプリケーションに追加します。

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

これを試して、

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

ビューに追加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 に答える