2009-08-25 4 views
0

J'ai quelques problèmes lors de la mise à jour des légendes créées à l'aide du script d'action.Danniellement mise à jour des légendes - ActionScript 3

Veuillez lire les étapes suivantes pour comprendre le problème.

  1. Créé un graphique linéaire avec deux séries de données.
  2. Création d'une légende.
  3. Diagramme et légende ajoutés à un conteneur.

  4. Il existe un bouton de mise à jour. Cliquez sur le bouton

  5. Maintenant, le graphique linéaire a été mis à jour avec trois séries de données.
  6. Lorsque j'ai essayé de mettre à jour la légende, elle indiquait toujours les valeurs initiales avec deux étiquettes au lieu de trois.

  7. Le code I utilisé pour obtenir (6)

possibilité

(1)

ce [ "containerId"]. GetChildByName ("legendName"). DataProvider = LineChart (cet [ » containerId "]. getChildByName (" chartName "));

l'option (2)

ce [ "containerId"] getChildByName ("legendName") dataProvider = ceci [ "containerId"] getChildByName ("chartName") comme LineChart...;

Un commentaire?

Merci Jay

+0

OK. Le problème était dû au code manquant pour mettre à jour la propriété série de la carte !!! chartInst.series = newSeries; Chaque fois que le fournisseur de données du graphique est mis à jour, même si j'ai remarqué que les séries de données sont automatiquement mises à jour dans le composant graphique, nous devons créer un nouveau jeu de séries pour comprendre la mise à jour. Ainsi, avant de définir le fournisseur de données de la légende, créez une nouvelle série et définissez-la sur la propriété série du graphique. Merci – Jay

+0

réponse mise à jour ... greetz – back2dos

Répondre

0

c'est un problème majeur avec flex: il est très difficile à utiliser avec AS3 ... mieux aller avec MXML et créer des liaisons ... le problème devrait probablement aller loin ...

une chose que je ne comprends pas bien, pourquoi un enfant est le dataprovider à l'autre, mais peut-être la mise en page de votre application qui fait clair ... généralement, DataProviders viennent de l'application du modèle de données ...


modifier: je pense, les liaisons sont la meilleure approche ... vous devez créer une classe comme suit:

class Data { 
    [Bindable(event="legendChanged")] 
    public function get legend():LegendType {/*implementation*/} 
    [Bindable(event="chartChanged")] 
    public function get chart():ChartType {/*implementation*/} 
    public function choseGraph(index:uint):void { 
     //update state so the getters for chart and legend will return the right values 
     this.dispatchEvent(new Event("legendChanged")); 
     this.dispatchEvent(new Event("chartChanged")); 
    }  
} 

puis lier votre point de vue à elle.

+0

Salut, Les DataProviders bindable ne va pas aider beaucoup ici, puisque je dois gérer autour de 50-60 graphiques dans une seule page et doivent les générer dynamiquement. Après est la structure que je maintiens Chaque fois qu'il ya certains changements dans l'entrée, je récupère le graphique pertinent et met à jour les séries de données et les légendes. J'espère que je vous ai donné une explication claire. -Jay – Jay

0

Il ya environ un an, j'ai fait de la levée de poids avec des diagrammes Flex et ils peuvent être une source constante de frustration. Le fait est qu'ils sont très intelligents à l'intérieur ce qui conduit à très difficile de raisonner sur les comportements. Une chose que j'ai remarquée, c'est que parfois, lorsque vous modifiez des données, il peut parfois prendre quelques images pour qu'elle traverse la hiérarchie. C'est même si vous mettez à jour le dataProvider sur la légende sur la même image que lorsque vous mettez à jour les informations de série, vous ne pouvez pas être lié à la version correcte de l'instance car il va changer dans quelques images. (c'est-à-dire que le changement au Series est asynchrone et le changement au dataProvider est synchrone).

Un test rapide pour voir si c'est votre problème est juste de mettre en place une minuterie de piratage. Réglez-le pour 100ms ou plus, puis réglez votre dataProvider plus tard - j'espère que lorsque les changements à la Series ont travaillé leur chemin à la propriété nécessaire. Une autre idée consiste à utiliser un deuxième bouton et une fois que vous voyez visuellement le nouveau Series utiliser ce bouton pour déclencher l'attribution des légendes dataProvider. Ce n'est pas une solution prête pour la production, mais elle déterminera au moins la nature du problème.

Si c'est votre problème (que je soupçonne, mais je ne suis pas certain de) alors commencez à chercher des événements qui viennent de tous les composants de la carte. L'événement qui signale le nouveau Series a été tiré peut provenir de n'importe où mais vous le trouverez finalement. Bonne chance.


En outre, la différence entre:

var foo:Bar = Bar(obj); // if !(obj is Bar) throw Error 

et

var foo:Bar = obj as Bar; // if !(obj is Bar) return null 

est le premier est le meilleur si vous êtes certain obj jetteront à un Bar et il lancera une exception si ce n'est pas le cas (en fait, ce serait une erreur si elle n'atteignait pas Bar). La deuxième (as) est pour quand il y a une chance raisonnable obj ne sera pas un Bar et il ne jettera pas une erreur et retournera plutôt null. En raison de ce comportement, Adobe recommande d'utiliser le premier formulaire chaque fois que cela est possible.

+0

No Luck in try a) Appel de fonction setTimeout pour définir le fournisseur de données de la légende. b) ajouter un nouveau bouton assigné à un gestionnaire d'événements qui prend soin d'affecter le fournisseur de données à l'instance de légende. Dans les deux cas ci-dessus, j'ai remarqué que le dataProvider (chartInstance) pointe vers la valeur initiale au lieu de l'instance mise à jour. Vous mettra à jour une fois que j'ai résolu ce problème. Merci Jay – Jay