我是Flex / Actionscript中的菜鸟所以我有代码,其中编译器不显示错误但代码没有返回任何内容。你能帮我解决一下吗?
Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="main()">
<fx:Script>
<![CDATA[
include 'AS/main.as';
private function main():void {
Label1.text = Login('irakli','password1');
}
]]>
</fx:Script>
<s:Label id="Label1" x="370" y="176" text="Label"/>
</s:Application>
main.as
// ActionScript file
import flash.events.*;
import flash.net.*;
var Answer:String;
function Login(username:String, password:String){
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');
request.method = URLRequestMethod.POST;
var variables:URLVariables = new URLVariables();
variables.username = username;
variables.password = password;
request.data = variables;
//handlers
loader.addEventListener(Event.COMPLETE, function(e:Event):void{
var loader:URLLoader = URLLoader(e.target);
Answer = loader.data;
});
loader.load(request);
var i:int = 1;
while (i < 10000000000){
if (Answer.length > 0){
return Answer;
break;
}
i++;
}
}
我知道使用事件处理程序函数很好,但我希望这段代码在main.mxml Label1.text = Login('irakli','password1');
中运行
答案 0 :(得分:1)
我看到一堆问题:
尝试修改内容以将其分解为两个函数,例如:
public function Login(username:String, password:String):void{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');
request.method = URLRequestMethod.POST;
var variables:URLVariables = new URLVariables();
variables.username = username;
variables.password = password;
request.data = variables;
//handlers
loader.addEventListener(Event.COMPLETE, onLoaderComplete);
loader.load(request);
}
public function onLoaderComplete(e:Event):void{
var loader:URLLoader = URLLoader(e.target);
Answer = loader.data;
label1.text = Answer;
}
在你的创作完成处理程序中,尝试这样的事情:
Login('irakli','password1');
它调用该方法。标签的值在完整的处理程序中设置。等待结果的方法是创建,但不必要。
答案 1 :(得分:1)
uiiuiui。这里有很多不妥之处。
尽量不要使用带大写字母的变量/函数
private var _myVar:String = "string";
private function myFunction():void
{
}
将变量/函数声明为private / public / protected
定义函数的返回类型
private function login (username:String, password:String):String
{
}
你不喜欢在这里使用include - 只需将你的login()方法放在Main.mxml中
不要在事件处理程序中使用匿名函数 - 而是定义一个自定义命名的函数:
loader.addEventListener(Event.COMPLETE, onComplete);
private function onComplete(event:Event):void
{
// do sth here ...
}
并且不要使用while循环来等待URLLoader的结果 - 这就是eventlistener的用途。
最好的事情是,如果你创建一个Login类来处理login-backend-communication并返回结果(ok或not ok),具体取决于服务器的答案。
package
{
public class Login
{
public function Login()
{
}
public function doLogin(username:String, password:String):void
{
// do loader stuff here ...
loader.addEventListener(Event.COMPLETE, onLoginResponse);
}
private function onLoginResponse(evt:Event):void
{
// check answer from server
if (server.response == "ok")
{
dispatchEvent(new Event('logged_in'));
}
}
}
}
答案 2 :(得分:1)
很抱歉,但希望以这种方式工作是完全错误的。你不能保证那个荒谬的循环可以工作,因为它可以在你的加载操作之前轻松完成。此外,在事件处理程序中使用内联函数被认为是不好的做法。
正确的做法是让Login成为一个类,并监听一个事件,以便填充文本框。
这就是你可以把Login写成一个类:
package {
import flash.events.*;
import flash.net.*;
public class Login extends EventDispatcher
{
public function Login(username:String, password:String):void
{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');
request.method = URLRequestMethod.POST;
var variables:URLVariables = new URLVariables();
variables.username = username;
variables.password = password;
request.data = variables;
loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
loader.load(request);
}
private function loadCompleteHander(evt:Event):void
{
// set the event on out of the class
dispatchEvent(evt);
}
}
}
那么你会像这样使用它:
var login:Login = new Login('irakli','password1');
login.addEventListener(Event.COMPLETE,setTheText);
function setTheText(evt:Event):void
{
Label1.text = evt.target.data;
}
当然如果您不想在mxml中使用监听器(我无法理解为什么会这样),那么我认为您最好的方法是将目标textField传递给Login函数并让它设置内联处理程序中的文本。类似的东西:
Login('irakli','password1',Label1);
main.as
// ActionScript file
import flash.events.*;
import flash.net.*;
import flash.text.TextField
var targetTF:TextField;
function Login(username:String, password:String,textField:TextField){
targetTF = textField;
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');
request.method = URLRequestMethod.POST;
var variables:URLVariables = new URLVariables();
variables.username = username;
variables.password = password;
request.data = variables;
//handlers
loader.addEventListener(Event.COMPLETE, function(e:Event):void{
var loader:URLLoader = URLLoader(e.target);
targetTF.text = loader.data;
});
loader.load(request);
}
答案 3 :(得分:1)
很抱歉,但这是我见过的最丑陋的ActionScript代码之一:(无法想象你来自哪种语言.PHP?
首先,在编写代码之前,请先阅读一些基础知识。
特别是关于代码:
include
语句的用途是什么?为什么不在Script
块中内联代码。您的代码模块化方式是使代码变得模糊且难以阅读和支持的最佳方法。Login
方法不会返回任何内容。为什么期望Login('irakli','password1')
会产生任何文字?