0

我在学习 Flex 方面取得了长足的进步,我非常喜欢它,但是,我找不到太多帮助的一件事是如何在 Flex 中绑定查询的结果。我已经设法创建列表等没问题,但是当我尝试将一个特定值绑定到一个变量时,它不起作用。

首先,这是我的 PHP 函数:

public function getRepnameByUsername($itemID) {

        $stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename where Username=?");
        $this->throwExceptionOnError();

        mysqli_stmt_bind_param($stmt, 'i', $itemID);        
        $this->throwExceptionOnError();

        mysqli_stmt_execute($stmt);
        $this->throwExceptionOnError();

        mysqli_stmt_bind_result($stmt, $row->RepID, $row->Username, $row->FirstName, $row->Surname, $row->SerialKey);

        if(mysqli_stmt_fetch($stmt)) {
          return $row;
        } else {
          return null;
        }

    }

然后,当然,我在 Flex 中的函数我没有包含所有变量,因为它们非常明显,我唯一遇到的问题是在这个函数中声明的 repServ 变量。

            protected function btnSubmitUser_clickHandler(event:MouseEvent):void
        {
            username = txtUsername.text;
            password = txtPassword.text;
            serialno = txtSerialNo.text;
            userName.writeUTFBytes(username);
            passWord.writeUTFBytes(password);
            serialNo.writeUTFBytes(serialno);
            EncryptedLocalStore.setItem("Username", userName);
            EncryptedLocalStore.setItem("Password", passWord);
            EncryptedLocalStore.setItem("Serial", serialNo);
            var repServ:Repname = new Repname();
            getRepnameByUsernameResult.token = repnameService.getRepnameByUsername(username);
            repServ = getRepnameByUsernameResult.lastResult;
            repid = repServ.RepID;
            RepID.writeInt(repid);
            EncryptedLocalStore.setItem("Rep", RepID);
        }

引发错误的行是 repid = repServ.RepID ,我认为这与我试图通过上面的行绑定它有关。这样做的最佳方法是什么?

谢谢J

4

1 回答 1

0

我发现您的代码有一些问题。首先,远程调用是异步的。这意味着它们在不同的线程中运行。所以如果我们看这段代码:

        getRepnameByUsernameResult.token = repnameService.getRepnameByUsername(username);
        repServ = getRepnameByUsernameResult.lastResult;

在您尝试访问结果时,getRepnameByUsername 服务很可能尚未完成执行或返回任何内容。相反,您应该在服务上侦听结果事件。概念上是这样的:

        getRepnameByUsernameResult.addEventListener(ResultEvent.RESULT, onMyResult);
        getRepnameByUsernameResult.token = repnameService.getRepnameByUsername(username);

然后在您的结果处理程序中,您可以处理结果:

protected function onMyResult(event:ResultEvent):void{
            repServ = getRepnameByUsernameResult.lastResult as Repname;
            repid = repServ.RepID;
            RepID.writeInt(repid);
            EncryptedLocalStore.setItem("Rep", RepID);
}

我看到的第二件事是错误的,您没有将 lastResult 转换为实际的对象类型。我本来希望这会引发运行时错误。我在上面的代码中添加了转换。

您没有告诉我们您使用的是什么类型的服务。(HTTPService、RemoteObject 或 WebService)。

看起来您从未使用结果数据创建名为 Repname 的对象。如果您使用 AMF (RemoteObject),那么您可以自动将服务器端对象转换为客户端对象。但是,您可能必须将您的查询转换为服务器上的该对象,以便它可以自动翻译。如果您使用 WebService 或 HTTPService,则必须解析客户端中的数据以将其转换为 Repname 对象。

lastResults 的结果很可能是一个通用对象。您可以使用如下语法访问特定属性:

getRepnameByUsernameResult.lastResult['repid']

您可以将其用作通用对象或手动转换它。

于 2012-03-04T14:54:36.117 回答