2014-07-14 75 views
0

我打算僅在用戶身份驗證後才從服務器加載數據。 爲了簡單起見,讓我們假設用戶已經過身份驗證。Sencha Touch登錄後從商店加載 - 競賽問題?

我在Main.js初始化函數中放置加載數據函數調用(用於從商店加載數據),如下所示。

然而,getStore(「STOREID」)。load()函數是異步,這使我在的情況下數據只存儲加載完成後的主視圖裝完這可能使視圖負荷而不擔心該數據(修復我,如果我錯了,也許sencha可以處理這個,視圖有參考storeId)。

針對此類問題的最佳做法是什麼?

瑣碎的解決方案:同步調用商店加載,但它有什麼區別嗎?以防萬一,如何做到這一點?我試圖添加同步變量設置爲true,但不起作用。

app.js

launch: function() { 

    // Destroy the #appLoadingIndicator element 
    Ext.fly('appLoadingIndicator').destroy(); 

    Ext.Ajax.request({ 
     url: MyApp.app.baseUrl + 'session/mobileCheckAuth', 
     method: "POST", 
     useDefaultXhrHeader: false, 
     withCredentials: true, 
     success: function(response, opts) { 
      if (response && response.status === 200) { 
       Ext.Viewport.add(Ext.create('MyApp.view.Main')); 
      } else { 
       Ext.Viewport.add(Ext.create('MyApp.view.LoginPanel')); 
      } 
     }, 
     failure: function(response, opts) { 
      alert('Unexpected failure detected'); 
      Ext.Viewport.add(Ext.create('MyApp.view.LoginPanel')); 
     } 
    }); 

}, 

Main.js

Ext.define('MyApp.view.Main', { 
... 
initialize: function() { 
    console.log('main.initialize'); 

    this.callParent(arguments); 

    // Load app data 
    MyApp.utils.Functions.loadData(); 
} 

回答

1

有兩種方法來解決這個問題:

  1. 如果您的視圖由網格的,不會有是一個競賽條件。如果網格在商店完成加載之前呈現,網格將使用添加的新數據自行更新。爲此,您必須將商店聲明爲「store:」mystore「;」 。

  2. 如果您有一個複雜的視圖不直接綁定到商店,則必須先加載商店,然後在商店的「加載」事件中初始化視圖的渲染。

    store.load({callback: function(){ 
        Ext.Viewport.add(Ext.create('MyApp.view.Main'} 
    }); 
    
+0

我覺得我得到了答案,但只是爲了確保:我有一個「延伸Ext.List」,並在配置類有「店:‘的MyStore’」,這也適用於第一個選項?網格是什麼意思?視圖和商店之間的自動同步在哪裏被記錄? – user2867106

+1

@ user2867106。你的問題一:1:是的。 2:'Ext.grid.Grid' 3:這是數據綁定而非自動同步('autoSync'是商店的一個屬性,指的是將更改同步到後端服務器)。數據綁定是MVC中的一個基本概念。我不能提及它的文檔,但任何有實時數據更改的例子都反映了這種基本行爲。 –