2009-08-06 5 views
0

Я пишу приложение Flex, используя запросы REST, и пытаюсь избежать кеширования HTTP, а также синхронизировать время клиент/сервер. Для этого я создал timestamp собственность как таковые:Свойства Flex ведут себя странно при использовании в HTTPService

// 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.

(На самом деле, я только что проверил еще раз, и это действительно делает то же самое для связываемых переменных. Но не со всеми клиентами. Есть некоторые версии Flash, есть «проблемы»?)

ответ

1

так что это только для чтения геттер ? Связывание не собирается обновлять {timestamp} в вашем компоненте HTTPService, поскольку у него нет свойства для привязки. timestamp - это результат функции (как упоминает Кристофер ниже) и не является свойством Bindable. Вам нужно либо создать свойство bindable, либо явно установить URL с текущей меткой времени, избегая связывания вообще.

Someplace в своем коде вы используете 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(); 
} 

таким образом избегая любые проблемы с привязкой ...

+0

Joel is correct. Поскольку вы никогда не говорите своему HTTPService о том, что значение «timestamp» изменилось, он не знает, как обновлять привязки данных. – Dan

+1

* TECHNICALLY * это не привязка данных, поскольку она относится к выходному значению функции, а не к свойству. – cwallenpoole

+0

Я обновил ответ, чтобы отразить вашу разработку Кристофера. Спасибо, что указали. –

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(); 
} 
Смежные вопросы