2012-06-13 60 views
0

我需要一種方法來禁止用戶與應用程序進行交互,以便某些調用服務器以獲取信息。我一直在使用以下代碼在服務器調用之前/之後禁用/啓用應用程序。基本上,它給用戶一個忙碌的光標,並在服務器上處理該呼叫時禁用應用程序。Flex:如何在服務器調用期間禁用用戶與應用程序的交互?

當從服務器呼叫提交,我執行:

CursorManager.setBusyCursor(); 
mx.core.FlexGlobals.topLevelApplication.enabled=false; 

當從服務器返回的號召,我執行:

CursorManager.removeBusyCursor(); 
mx.core.FlexGlobals.topLevelApplication.enabled=true; 

這樣做的問題是,應用程序的顏色變暗。有沒有辦法防止它變暗?或者,我可以以某種方式禁用鼠標點擊和鍵盤嗎?或者,在這種情況下其他人做什麼?

+0

如果它是一個Spark應用程序,你可以在'Application'類創建一個自定義皮膚,去除一部分說:'alpha.disabled =「0.5」' – RIAstar

+0

謝謝RIAstar。您知道,有一個'mx.core.FlexGlobals.topLevelApplication.alpha'設置,但如果將其設置爲1,則應用程序處於禁用狀態時不起作用。 – ggkmath

+0

這是'Application'實例的'alpha',而不是它的皮膚。你可以設置'FlexGlobals.topLevelApplication.skin.alpha',但即使如此,我猜這個值在皮膚狀態改變時仍然會被覆蓋。你必須在皮膚的currentStateChange事件之後設置它,但這看起來很醜陋。 – RIAstar

回答

3

嘗試:

// in your method 
const stage:Stage = mx.core.FlexGlobals.topLevelApplication.stage; 
if (stage) 
    stage.mouseChildren = false; // or true of course 
+0

謝謝,這是否也可以以某種方式禁用鍵盤? – ggkmath

+0

是的,它應該。您可以通過調用Event#preventDefault()和Event#stopPropagation()來禁用捕獲階段的KeyBoard事件。 –

+0

'if(stage)'檢查的是什麼(也就是說,在什麼情況下它是真是假)? – ggkmath

1

我有一個AMFConnector類,讓我所有的電話。每當此類將進行調用時,它將光標設置爲繁忙模式並將布爾屬性設置爲true(amf_busy)。我的所有應用程序都是使用該屬性來創建調用/命令的主動/去激活按鈕。 您的解決方案更快更輕鬆,但正如您所述,它會使整個屏幕變得黯淡,並且它不是非常人性化。現在,當用戶看到他做出行動時,只要按鈕消失,他就會自動意識到他現在必須等待服務器返回答案,即使他不瞭解客戶端服務器調用。

編輯: 至於禁用鼠標/鍵盤,它也不是非常人性化。如果您使用該解決方案,則必須小心用戶配置文件。用戶很可能會看到'有時'鍵盤/鼠標停止工作'顯然沒有理由',因爲他不明白髮生了什麼。

編輯II: 由於我不知道BlazeDS是如何工作的,我將使用我自己的示例,您可能會嘗試翻譯它。

這是一個簡單的電話會是什麼樣子:

//creating a object connection. 
var gateway:NetConnection = new Netconnection(); 
//connect 
gateway.connect(url_connection_here); 
//Making a simple call 
gateway.call("UserController/GetUser", new Responder(onResult, onfault)); 

這是你會做什麼:

創建網關接收呼叫:

[Bindable] public class AMFConnctor{ 
     private var instance:AMFConnector = new AMFConnector(); 

     public function getInstance():AMFConnector{ 
      return instance; 
     } 

     public function AMFConnector(){ 
      if(instance){ 
      throw new Error("Singleton class cannot be instanced. Use getInstance() method instead."); 
      } 
     } 

     private var _amf_busy:Boolean = false;   
     public function get amf_busy():Boolean{ 
      return _amf_busy; 
     } 

     public function set amf_busy(value:Boolean):void{ 
      //If you are setting to true (yes, it's busy) 
      if(value){ 
       CursorManager.setBusyCursor(); 
       _amf_busy = true; 
      }else{ 
       _amf_busy = false; 
       CursorManager.removeBusyCursor(); 
      } 
     } 

     //Here I assume that everytime that I ask this class for the gateway 
     //it's because I'm going to make a call, which means that I want the 
     //rest of the application knows that AMF is currently busy. 
     public function get Gateway():NetConnection{ 
      amf_busy = true; 
      return this._gateway; 
     } 
} 

如果你有類似這樣的網關,您現在可以輕鬆配置您的按鈕:

<mx:Button id="btnSubmit1" label="Submit" click="action" icon="@Embed(source='images/ok.png')" enabled="{!AMFConnector.getInstance().amf_busy}"/> 
<mx:Button id="btnCancel1" label="Cancel" click="action" icon="@Embed(source='images/cancel.png')" enabled="{!AMFConnector.getInstance().amf_busy}"/> 

現在,唯一需要確定的是,在'onResult'函數中,在服務器端返回您的調用之後將調用的函數中,必須確保將amf_busy屬性設置爲Off(假),並且會自動啓用所有按鈕。

+0

我也在使用BlazeDS進行服務器調用。你能描述更多關於「...設置一個布爾屬性爲真(amf_busy)」嗎?代碼是什麼樣的,它對用戶有什麼影響? – ggkmath

+0

如果鼠標光標處於「繁忙」狀態,用戶可能不會指望他/她可以點擊任何東西,所以在這裏禁用鼠標/鍵盤不應該讓用戶感到困惑。 – ggkmath

+0

這是真的。雖然我不使用網關只是啓用/禁用按鈕。對我而言,有一位經理可以告訴我是否正在進行一個呼叫或者全部結束,並且我也使用它來避免多次呼叫,這一點非常重要。例如,在某些屏幕中,您必須大量調用服務器以獲取不同類型的數據,以便用戶可以在ComboBox,DataGrid等中使用它。使用網關的方式可以讓我累積所有呼叫我想在一次呼叫中完成,然後只在一個連接隧道內將其發送到服務器,從而節省帶寬並使其更快。 –

1

適合我的是...

private var _lastFocusedElement:InteractiveObject; 

private function set enabled(value:Boolean):void { 
    value ? CursorManager.removeBusyCursor(): CursorManager.setBusyCursor(); 
    var stage:Stage = FlexGlobals.topLevelApplication.stage; 
    if (stage) { 
     stage.mouseChildren = value; 
     stage.tabChildren = value; 
     if (!value) 
      _lastFocusedElement = stage.focus; 
     stage.focus = value ? _lastFocusedElement : null; 
    } 
} 

問候,Vjeko

+0

帶標記字段的鍵盤輸入怎麼樣? –

0

這裏是一個簡單soution: -

protected static function toggleScreenClick (value : Boolean) : void 

    { 

     if (value) 
     { 
      FlexGlobals.topLevelApplication.setStyle("disabledOverlayAlpha", 0.5); 
     } 
     else 
     { 
      FlexGlobals.topLevelApplication.setStyle("disabledOverlayAlpha", 0.0); 
     } 
     FlexGlobals.topLevelApplication.enabled = value; 
    } 
相關問題