2009-08-06 5 views
0

J'écris une application Flex à l'aide de requêtes REST et j'essaie d'éviter la mise en cache HTTP et de synchroniser le temps client/serveur. À cette fin, j'ai créé une propriété timestamp en tant que tel:Les propriétés Flex se comportent étrangement lorsqu'elles sont utilisées dans HTTPService

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

(Le clientClockAdjustMsec je l'ai déjà mis à l'aide mojo spéciale)

je tente également d'inclure l'horodatage dans ma chaîne de requête comme ceci: Mais ce que je vois dans les journaux d'accès est bizarre. C'est quelque chose comme ceci:

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 

Voir comment les horodatages sont tous les mêmes? Si étrange. Je m'attendrais à ce qu'il évalue la propriété à chaque fois, comme c'est le cas pour les variables Bindable.

(En fait, je viens de vérifier à nouveau et il ne fait la même chose pour les variables Bindable. Mais pas avec tous les clients. Faites des versions de Flash ont des « problèmes »?)

Répondre

1

c'est donc une lecture seule getter ? La liaison ne mettra pas à jour {timestamp} dans votre composant HTTPService car il n'a aucune propriété à lier. timestamp est la sortie d'une fonction (comme Christopher le mentionne plus bas) et n'est pas une propriété Bindable. Vous devez soit créer une propriété pouvant être liée, soit définir explicitement l'URL avec un horodatage en cours, évitant ainsi toute liaison.

Someplace dans votre code que vous utilisez myService.send(), vous devez faire quelque chose comme:

[Bindable] 
private var timestamp:Number; 

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

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

si pour une raison qui n'a pas fonctionné:

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

évitant ainsi tout problème de liaison ...

+0

Joel a raison. Parce que vous ne dites jamais à votre HTTPService que la valeur de 'timestamp' a changé, il ne sait pas mettre à jour les liaisons de données. – Dan

+1

* TECHNICALLY * Ceci n'est pas une liaison de données car elle concerne la valeur de sortie d'une fonction et non une propriété. – cwallenpoole

+0

J'ai mis à jour la réponse pour refléter votre élaboration Christopher. Je vous remercie de le faire remarquer. –

1

L'autre chose que vous pouvez faire est de rendre la fonction get lisible par un événement spécifique.

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

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