2012-04-26 54 views
0

我在優化我的Sencha Touch 2應用程序時多次遇到此問題。是否有可能將Ext.Component聲明爲全局變量?

很明顯,我應該保持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一旦創建它,​​就像這樣:

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

只有在控制器使用:

taxi.main_container = temp; 

它的工作原理是第一次。但在第二次,它顯示此錯誤:

Uncaught TypeError: Cannot call method 'replaceCls' of null 
+0

不知道如果是這樣的一個錯誤ST2:http://www.sencha.com/forum/showthread.php?189025-Calling-Ext.Msg.show-with-items-second-time-給出一個錯誤...我看到在sencha-touch-all-debug.js中有大約20個replaceCls的調用你能看到哪一個是從Chrome堆棧跟蹤中調用的嗎? – 2012-04-27 15:52:22

+0

我的不好,我沒有足夠的耐心來回溯和調試這些核心來源:(即使我現在已經找到了解決方法,通過使用這種:'mainContainer.add({xtype:'LocationPanel ',showAnimation:null});'它仍然在Chrome開發工具中顯示一個奇怪的錯誤:'未捕獲的TypeError:無法讀取屬性'dom'null' – 2012-04-27 16:00:18

回答

1

你可以使用應用程序的「全局命名空間」?那麼你可以在應用程序的任何地方引用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')); 
    } 
}); 

Sencha示例中的另一個想法是在KitchenSink演示中。在app/controllers/Main.js中,他們使用視圖緩存,該視圖緩存在config:{}中設置並通過getter/setter訪問。我認爲主控制器一直存在,所以你的緩存總是可用的。事實上,如果你的控制器加載到app.js中,那麼你的控制器是不是都會持續存在?

 
controllers: ['Main','FooController', 'BarController'], 

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

 
config: { 
     /** 
     * @private 
     */ 
     viewCache: [], // Accessed via getViewCache(), setViewCache() 

     ... 
}, 

createView: function(name) { 
     var cache = this.getViewCache(), // Implied getter 
      ln = cache.length, 
      limit = 20, // max views to cache 
      view, i, oldView; 

     // See if view is already in the cache and return it 
     Ext.each(cache, function(item) { 
      if (item.viewName === name) { 
       view = item; 
       return; 
      } 
     }, this); 

     if (view) { 
      return view; 
     } 

     // If we've reached our cache limit then remove something 

     if (ln >= limit) { 
      for (i = 0; i < ln; i++) { 
       oldView = cache[i]; 
       if (!oldView.isPainted()) { 
        oldView.destroy(); 
        cache.splice(i, 1); 
        break; 
       } 
      } 
     } 
     // Create the view and add it to the cache 
     view = Ext.create(name); 
     view.viewName = name; 
     cache.push(view); 
     this.setViewCache(cache); // Implied setter 

     return view; 
    }, 
+0

我嘗試了很多次,但不幸的是,全局命名空間不起作用。總是會導致錯誤,不能直接更新順便說一句,你能解釋更多關於'viewCache'嗎? – 2012-04-27 04:14:54

+0

我試圖擴展到目前爲止我所知道的內容,在某些時候我也需要弄清楚。認爲你在你的發展中前進了一步。 – 2012-04-27 14:47:05

+0

請看我更新的問題,那真的是我以前遇到過很多次的問題,並且非常沮喪.. – 2012-04-27 15:31:39

0

試試這個,

var appNS = new Ext.application({ 

    name: 'app', 
    //others 

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

    //others 

}); 

,然後你可以使用它控制

console.log(appNs.SavedValue); 

我希望它可能是有益的內。

+0

不幸的是,那是局部變量,而不是全局變量 – 2012-06-01 14:09:22

0

另一個soln緩存你的意見。它實際上並不緩存。 首先將數組添加到您的應用程序中。

Ext.application({ 
name: 'app', 


viewCache: [], 

viewCacheCount: 0, 


launch: function() {  

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

} 
}); 

,這可以在任何控制器裏面的東西被retrive像

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

我不知道它可能會在某些視圖/是自動銷燬的部件的情況下創造了一些問題。

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' 
     } 
    ] 
} 
}); 
相關問題