我需要一种方法来禁止用户与应用程序的交互,以便对服务器进行某些调用以获取信息。我一直在使用以下代码在服务器调用之前/之后禁用/启用应用程序。基本上,它为用户提供了一个忙碌的光标,并在服务器上处理呼叫时禁用了应用程序。
当提交来自服务器的呼叫时,我执行:
CursorManager.setBusyCursor();
mx.core.FlexGlobals.topLevelApplication.enabled=false;
当来自服务器的调用返回时,我执行:
CursorManager.removeBusyCursor();
mx.core.FlexGlobals.topLevelApplication.enabled=true;
这存在应用程序颜色变暗的问题。有没有办法防止它变暗?或者,我可以以某种方式禁用鼠标单击和键盘吗?或者,其他人在这种情况下做了什么?
答案 0 :(得分:3)
尝试:
// in your method
const stage:Stage = mx.core.FlexGlobals.topLevelApplication.stage;
if (stage)
stage.mouseChildren = false; // or true of course
答案 1 :(得分:1)
我有一个AMFConnector类可以进行所有调用。每次该类进行调用时,它会将光标设置为Busy Mode并将boolean属性设置为true(amf_busy)。构建我的所有应用程序都是为了将该属性用于调用/命令的active / desactive按钮。 您的解决方案更快更容易,但正如您所述,它会淡化整个屏幕,并且不是非常用户友好。现在,当用户看到他做出动作时,只有按钮消失,他自动意识到他现在必须等待服务器回来,即使他不理解客户端 - 服务器呼叫。
编辑: 至于禁用鼠标/键盘,它也不是非常用户友好。如果您使用该解决方案,则必须小心用户配置文件。用户可能会看到“有时候”键盘/鼠标停止工作“显然没有理由”,因为他不明白发生了什么。
编辑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(假)并且会自动启用所有按钮。
答案 2 :(得分: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
答案 3 :(得分:0)
这是一个简单的解决方案: -
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;
}