在HTTPService中使用时,Flex属性的行为很奇怪

时间:2009-08-06 19:52:06

标签: flex actionscript-3 flex3

我正在使用REST请求编写Flex应用程序,并尝试避免HTTP缓存以及同步客户端/服务器时间。为此我创建了一个timestamp属性:

// returns a timestamp corrected for server time            
private function get timestamp() : Number
{
    return new Date().getTime() + clientClockAdjustMsec;
}

clientClockAdjustMsec我已经使用特殊魔法设置了

我还尝试在我的查询字符串中包含时间戳,如下所示:

<mx:HTTPService url="/Service?ts={timestamp}" ...

但是我在访问日志中看到的很奇怪。它是这样的:

1.2.3.4 - - [06/Aug/2009:17:19:47 +0000] "GET /Service?ts=1249579062937 HTTP/1.1" 200 478
1.2.3.4 - - [06/Aug/2009:17:20:13 +0000] "GET /Service?ts=1249579062937 HTTP/1.1" 200 500
1.2.3.4 - - [06/Aug/2009:17:20:14 +0000] "GET /Service?ts=1249579062937 HTTP/1.1" 200 435

看看时间戳是如何相同的?这么奇怪。我希望它每次都能评估属性,就像Bindable变量一样。

(实际上,我刚刚再次检查过,它确实对Bindable变量做了同样的事情。但不是对所有客户端都这样做。某些版本的Flash有“问题”吗?)

2 个答案:

答案 0 :(得分:1)

所以这是一个只读的getter?绑定不会更新HTTPService组件中的{timestamp},因为它没有要绑定的属性。 timestamp是函数的输出(正如Christopher在下面提到的那样)并且不是Bindable属性。您需要创建一个可绑定属性,或者使用当前时间戳显式设置URL,从而避免完全绑定。

您的代码中某处使用myService.send(),您需要执行以下操作:

[Bindable]
private var timestamp:Number;

private function whereSendHappens():void
{
    timestamp = new Date().getTime() + clientClockAdjustMsec;
    myService.send()
}

<mx:HTTPService url="/Service?ts={timestamp}" ...

如果由于某些原因不起作用:

private function whereSendHappens():void
{
    timestamp = new Date().getTime() + clientClockAdjustMsec;
    myService.url = "/Service?ts=" + timestamp;
    myService.send();
}

因此避免了任何约束性问题......

答案 1 :(得分:1)

您可以做的另一件事是使get函数可绑定到特定事件。

[Bindable("updateTimestamp")]
public function get timestamp() : Number { ... }

public function whereSendHappens():void
{
    dispatchEvent(new Event("updateTimestamp")); // will cause the binding to fire
    myService.send();
}